Beispiel #1
0
    def createRowsCols(self, table, chkDenouement, dict_denouement_mkb):
        '''

        :param table:
        :param chkDenouement: bool
        :param dict_denouement_mkb: MKBs
        :return:
        '''
        lst_frth_row = [u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9', u'10', u'11', u'12']

        lst_count = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]

        dict_mkb = OrderedDict()
        dict_mkb['некоторые инфекционные и паразитарные болезни'] = 'A00 - B99'
        dict_mkb['новообразования'] = 'C00 - D48'
        dict_mkb['болезни крови, кроветворных органов и отдельные нарушения, вовлекающие иммунный механизм'] = 'D50 - D89'
        dict_mkb['болезни эндокринной системы, расстройства питания и нарушения обмена веществ'] = 'E00 - E90'
        dict_mkb['психические расстройства и расстройства поведения'] = 'F00 - F99'
        dict_mkb['болезни нервной системы'] = 'G00 - G99'
        dict_mkb['болезни глаза и его придаточного аппарата'] = 'H00 - H59'
        dict_mkb['болезни уха и сосцевидного отростка'] = 'H60 - H95'
        dict_mkb['болезни системы кровообращения'] = 'I00 - I99'
        dict_mkb['болезни органов дыхания'] = 'J00 - J99'
        dict_mkb['болезни органов пищеварения'] = 'K00 - K93'
        dict_mkb['болезни кожи и подкожной клетчатки'] = 'L00 - L98'
        dict_mkb['болезни костно-мышечной системы и соединительной ткани'] = 'M00 - M99'
        dict_mkb['болезни мочеполовой системы'] = 'N00 - N99'
        dict_mkb['беременность, роды и послеродовой период'] = 'O00 - O99'
        dict_mkb['отдельные состояния, возникающие в перинатальном периоде'] = 'P00 - P96'
        dict_mkb['врожденные аномалии, пороки развития, деформации и хромосомные нарушения'] = 'Q00 - Q99'
        dict_mkb['симптомы, признаки и отклонения от нормы, выявленные при клинических и лабораторных исследованиях, ' \
                 'не классифицированные в других  рубриках'] = 'R00 - R99'
        dict_mkb['травмы, отравления и некоторые другие последствия воздействия внешних причин'] = 'S00 - T98'
        dict_mkb['Кроме того: факторы, влияющие на состояние здоровья и обращения в учреждения здравоохранения'] = 'Z00 - Z99'
        #OrderedDict((word, True) for word in dict_mkb)
        i = table.addRow()
        for j in range(0, 12):
            table.setText(i, lst_count[j], lst_frth_row[j])

        i = table.addRow()
        table.setText(i, 0, "Всего, в том числе:")
        table.setText(i, 1, "1")

        if chkDenouement is False:
            table.setText(i, 2, "A00-T98")
            for j in range(0, len(dict_mkb)):
                i = table.addRow()
                table.setText(i, 0, dict_mkb.keys()[j])
                table.setText(i, 1, lst_count[j+2])
                table.setText(i, 2, dict_mkb.values()[j])
        elif chkDenouement is True:
            table.setText(i, 2, "")
            for j in range(0, len(dict_denouement_mkb)):
                i = table.addRow()
                table.setText(i, 0, dict_denouement_mkb.keys()[j])
                table.setText(i, 1, j+2)
                table.setText(i, 2, dict_denouement_mkb.values()[j])
Beispiel #2
0
class CConnectionDialog(QtGui.QDialog, Ui_connectionDialog):

    iniFileName = 'connections.ini'

    def __init__(self, parent):
        QtGui.QDialog.__init__(self, parent)
        self.setupUi(self)

        self.edtConnectionName.completer().setCompletionMode(
            QtGui.QCompleter.UnfilteredPopupCompletion)
        self.connect(self, QtCore.SIGNAL('accepted()'),
                     self.saveConnectionInfo)
        self.connectionInfo = OrderedDict()
        self.loadConnectionInfo()

    def setDriverName(self, val):
        pass

    def driverName(self):
        return 'mysql'

    def setServerName(self, val):
        self.edtServerName.setText(val)

    def setConnectionName(self, name):
        defaultName = u'Основной'
        connectionIndex = self.edtConnectionName.findText(name)
        if connectionIndex < 0:
            connectionIndex = self.edtConnectionName.findText(defaultName)
        if connectionIndex < 0:
            connectionIndex = self.edtConnectionName.findText(
                self.serverName())

        if connectionIndex < 0:
            self.edtConnectionName.setEditText(defaultName)
        else:
            self.edtConnectionName.setCurrentIndex(connectionIndex)

    def connectionName(self):
        return self.edtConnectionName.currentText()

    def serverName(self):
        return str(self.edtServerName.text())

    def setServerPort(self, val):
        self.edtServerPort.setValue(val)

    def serverPort(self):
        return self.edtServerPort.value()

    def setDatabsaseName(self, val):
        self.edtDatabaseName.setText(val)

    def setLoggerDbName(self, val):
        self.edtLoggerDbName.setText(val)

    def databaseName(self):
        return self.edtDatabaseName.text()

    def loggerDbName(self):
        if self.edtLoggerDbName.text():
            return self.edtLoggerDbName.text()
        else:
            self.edtLoggerDbName.setText(u"logger")
            return self.edtLoggerDbName.text()

    def setCompressData(self, val):
        self.chkCompressData.setChecked(bool(val))

    def compressData(self):
        return self.chkCompressData.isChecked()

    def setUserName(self, val):
        self.edtUserName.setText(val)

    def userName(self):
        return self.edtUserName.text()

    def setPassword(self, val):
        self.edtPassword.setText(val)

    def password(self):
        return str(self.edtPassword.text())

    def setNewAuthorizationScheme(self, val):
        checkedValue = bool(val)
        self.chkAutScheme.setChecked(checkedValue)
        self.on_chkAutScheme_clicked(checkedValue)

    def newAuthorizationScheme(self):
        return self.chkAutScheme.isChecked()

    def connectionOrgId(self):
        connectionInfo = self.connectionInfo.get(
            self.edtConnectionName.currentText(), None)
        return connectionInfo[3] if connectionInfo else 0

    def connectionLogin(self):
        connectionInfo = self.connectionInfo.get(
            self.edtConnectionName.currentText(), None)
        return connectionInfo[4] if connectionInfo else u''

    def connectionOrgStructureId(self):
        connectionInfo = self.connectionInfo.get(
            self.edtConnectionName.currentText(), None)
        return connectionInfo[5] if connectionInfo else 0

    @QtCore.pyqtSlot(bool)
    def saveConnectionInfo(self):
        settings = CPreferences.getSettings(self.iniFileName)
        settings.beginGroup(self.edtConnectionName.currentText())
        settings.setValue('host', toVariant(self.serverName()))
        settings.setValue('port', toVariant(self.serverPort()))
        settings.setValue('database', toVariant(self.databaseName()))
        settings.setValue('loggerdb', toVariant(self.loggerDbName()))
        #        settings.setValue('orgId', toVariant(QtGui.qApp.currentOrgId()))
        settings.endGroup()
        settings.sync()

    def loadConnectionInfo(self):
        self.connectionInfo.clear()
        settings = CPreferences.getSettings(self.iniFileName)
        for connectionName in settings.childGroups():
            settings.beginGroup(connectionName)
            self.connectionInfo[connectionName] = (
                forceString(settings.value('host', connectionName)),
                forceInt(settings.value('port', 0)),
                forceString(settings.value('database', u's11')),
                forceRef(settings.value('orgId', None)),
                forceString(settings.value('login', u'')),
                forceRef(settings.value('orgStructureId', None)),
                forceString(settings.value('loggerdb', u'logger')))
            settings.endGroup()
        self.edtConnectionName.addItems(self.connectionInfo.keys())

    @QtCore.pyqtSlot(bool)
    def on_chkAutScheme_clicked(self, checked):
        self.groupBox.setEnabled(not checked)

    @QtCore.pyqtSlot(int)
    def on_edtConnectionName_currentIndexChanged(self, index):
        currentText = self.edtConnectionName.currentText()
        if currentText in self.connectionInfo.keys():
            host, port, database = self.connectionInfo[currentText][:3]
            loggerdb = self.connectionInfo[currentText][6]
            self.setServerName(host)
            self.setServerPort(port)
            self.setDatabsaseName(database)
            self.setLoggerDbName(loggerdb)

    @QtCore.pyqtSlot()
    def on_btnDelConnectionInfo_clicked(self):
        settings = CPreferences.getSettings(self.iniFileName)
        currentText = self.edtConnectionName.currentText()
        if currentText in settings.childGroups():
            settings.remove(currentText)
            settings.sync()
        self.connectionInfo.pop(currentText, None)
        self.edtConnectionName.clear()
        self.edtConnectionName.addItems(self.connectionInfo.keys())
        self.edtConnectionName.setCurrentIndex(0)
Beispiel #3
0
    def build(self, params):
        doc = QtGui.QTextDocument()

        cursor = QtGui.QTextCursor(doc)
        cursor.setCharFormat(CReportBase.ReportTitle)
        cursor.insertText(self.title())
        cursor.insertBlock()
        self._title = u"3.1. Дневные стационары для взрослых"
        cursor.insertText(self.title())
        cursor.insertBlock()
        self.dumpParams(cursor, params)
        cursor.insertBlock()
        cursor.insertText("(3000)")
        cursor.insertBlock()

        tableColumns = [
            ('24%', [u'Наименование классов МКБ-10', u'', u''], CReportBase.AlignLeft),
            ('3%', [u'№ строки', u'', u''], CReportBase.AlignLeft),
            ('10%', [u'Код по МКБ-10', u'', u''], CReportBase.AlignLeft),
            ('7%', [u'Дневные стационары медицинских организаций, оказывающих медицинскую помощь', u'в стационарных условиях', u'Выписано пациентов'], CReportBase.AlignLeft),
            ('7%', [u'', u'', u'Проведено пациенто - дней'], CReportBase.AlignLeft),
            ('7%', [u'', u'', u'Умерло'], CReportBase.AlignLeft),
            ('7%', [u'', u'в амбулаторных условиях', u'Выписано пациентов'], CReportBase.AlignLeft),
            ('7%', [u'', u'', u'Проведено пациенто - дней'], CReportBase.AlignLeft),
            ('7%', [u'', u'', u'Умерло'], CReportBase.AlignLeft),
            ('7%', [u'', u'на дому', u'Выписано пациентов'], CReportBase.AlignLeft),
            ('7%', [u'', u'', u'Проведено пациенто - дней'], CReportBase.AlignLeft),
            ('7%', [u'', u'', u'Умерло'], CReportBase.AlignLeft)
        ]

        table = createTable(cursor, tableColumns)
        RegularBedId = getVal(params, 'RegularBedId', None)
        chkDenouement = getVal(params, 'chkDenouement', False)

        db = QtGui.qApp.db
        orgStructureId = getVal(params, 'orgStructureId', None)
        tblOrgstructure = db.table('OrgStructure')
        Orgstructure = db.getRecordList(tblOrgstructure, cols='id, name, parent_id')
        lst_id = []

        if orgStructureId is None:
            '''
            load everything from orgstructure, if no organisation is chosen
            '''
            for rec in Orgstructure:
                lst_id.append(int(forceString(rec.value("id"))))
        else:
            '''
            list from the organisation_tree that should be included
            '''
            lst_id.append(int(orgStructureId))
            for id in lst_id:
                for rec in Orgstructure:
                    if int(id) == int(forceString(rec.value("parent_id"))) and int(
                            forceString(rec.value("id"))) not in lst_id:
                        lst_id.append(int(forceString(rec.value("id"))))

        ii = 0
        lst_bedProfile = [
            "(oh.isPermanent = 1 OR oh.isPermanent = 0)", "oh.isPermanent = 1", "oh.isPermanent = 0"
        ]

        lst_MKB = ["'A00%%' AND 'B99%%' OR d.MKB LIKE 'B99%%'", "'C00%%' AND 'D48%%' OR d.MKB LIKE 'D48%%'",
                   "'D50%%' AND 'D89%%' OR d.MKB LIKE 'D89%%'", "'E00%%' AND 'E90%%' OR d.MKB LIKE 'E90%%'",
                   "'F00%%' AND 'F99%%' OR d.MKB LIKE 'F99%%'", "'G00%%' AND 'G99%%' OR d.MKB LIKE 'G99%%'",
                   "'H00%%' AND 'H59%%' OR d.MKB LIKE 'H59%%'", "'H60%%' AND 'H95%%' OR d.MKB LIKE 'H95%%'",
                   "'I00%%' AND 'I99%%' OR d.MKB LIKE 'I99%%'", "'J00%%' AND 'J99%%' OR d.MKB LIKE 'J99%%'",
                   "'K00%%' AND 'K93%%' OR d.MKB LIKE 'K93%%'", "'L00%%' AND 'L98%%' OR d.MKB LIKE 'L98%%'",
                   "'M00%%' AND 'M99%%' OR d.MKB LIKE 'M99%%'", "'N00%%' AND 'N99%%' OR d.MKB LIKE 'N99%%'",
                   "'O00%%' AND 'O99%%' OR d.MKB LIKE 'O99%%'", "'P00%%' AND 'P96%%' OR d.MKB LIKE 'P96%%'",
                   "'Q00%%' AND 'Q99%%' OR d.MKB LIKE 'Q99%%'", "'R00%%' AND 'R99%%' OR d.MKB LIKE 'R99%%'",
                   "'S00%%' AND 'T98%%' OR d.MKB LIKE 'T98%%'", "'Z00%%' AND 'Z99%%' OR d.MKB LIKE 'Z99%%'"]

        bedProfile = lst_bedProfile[0]
        if RegularBedId == 0:
            bedProfile = lst_bedProfile[0]
        elif RegularBedId == 1:
            bedProfile = lst_bedProfile[1]
        else:
            bedProfile = lst_bedProfile[2]

        dict_denouement_mkb = OrderedDict()
        tblMKB = db.table('MKB')

        if chkDenouement is True:
            for row in range(0, len(lst_MKB)):
                for org_id in range(0, len(lst_id)):
                    MKB_query = u"d.MKB BETWEEN %s" % lst_MKB[row]
                    query_SDP = selectDataMKB(params, lst_id[org_id], bedProfile,8, MKB_query)
                    query_DS = selectDataMKB(params, lst_id[org_id], bedProfile, 7, MKB_query)
                    self.setQueryText(forceString(query_SDP.lastQuery()))
                    self.setQueryText(forceString(query_DS.lastQuery()))
                    while query_SDP.next():
                        record = query_SDP.record()
                        mkb = forceString(record.value('MKB'))
                        mkb_name = db.getRecordEx(table=tblMKB, cols='DiagName', where=tblMKB['DiagID'].eq(mkb))
                        field = mkb_name.field(0)
                        dict_denouement_mkb[field.value().toString()] = forceString(record.value('MKB'))

                    while query_DS.next():
                        record = query_DS.record()
                        mkb = forceString(record.value('MKB'))
                        mkb_name = db.getRecordEx(table=tblMKB, cols='DiagName', where=tblMKB['DiagID'].eq(mkb))
                        field = mkb_name.field(0)
                        dict_denouement_mkb[field.value().toString()] = forceString(record.value('MKB'))

        elif chkDenouement is False:
            for row in range(0, len(lst_MKB)):
                dict_denouement_mkb[lst_MKB[row]] = ""

        self.createRowsCols(table, chkDenouement, dict_denouement_mkb)

        sumPac_col4 = 0
        sumDays_col5 = 0
        sumOth_col6 = 0
        sumPac_col7 = 0
        sumDays_col8 = 0
        sumOth_col9 = 0
        '''
        We are looping through list of MKB ranges, checking in each orgstructure if they have that bed
        summing the values for each bed
        '''
        for row in range(0, len(dict_denouement_mkb)):
            sum_col5 = 0
            sum_col8 = 0
            days_col5 = 0
            days_col8 = 0
            sumcol4 = 0
            sumcol6 = 0
            sumcol7 = 0
            sumcol9 = 0

            for org_id in range(0, len(lst_id)):
                if chkDenouement is False:
                    str_mkb = str(dict_denouement_mkb.keys()[row])[-6:-1]  # F99%%
                    MKB_query = u"(d.MKB BETWEEN %s OR d.MKB LIKE '%s')" % (dict_denouement_mkb.keys()[row], str_mkb)
                    '''
                    MKB_query (d.MKB BETWEEN 'E00%' AND 'E90%' OR d.MKB='E00')
                    '''
                    #MKB_query = u"d.MKB BETWEEN %s" % (dict_denouement_mkb.keys()[row])

                elif chkDenouement is True:
                    MKB_query = u"d.MKB = '%s'" % dict_denouement_mkb.values()[row]

                query_col5 = selectData_PacientDays(params, lst_id[org_id],bedProfile, 8, MKB_query)
                query_col8 = selectData_PacientDays(params, lst_id[org_id], bedProfile, 7, MKB_query)

                query = selectData(params, lst_id[org_id], bedProfile, MKB_query)

                self.setQueryText(forceString(query.lastQuery()))
                self.setQueryText(forceString(query_col5.lastQuery()))
                self.setQueryText(forceString(query_col8.lastQuery()))
                '''
                sum of pacients for every organisation (that's why in this for)
                '''
                while query_col5.next():
                    record_col5 = query_col5.record()
                    '''
                    get the number of days having in mind the length of the working week
                    '''
                    days_col5 = getEventLengthDays(
                        forceDate(record_col5.value('e_set')),
                        forceDate(record_col5.value('e_exec')),
                        countRedDays=False,
                        eventTypeId=forceString(record_col5.value('et_id')),
                        isDayStationary=True)

                    sum_col5 += int(days_col5)
                '''
                Всего, в том числе
                '''

                while query_col8.next():
                    record_col8 = query_col8.record()
                    days_col8 = getEventLengthDays(
                        forceDate(record_col8.value('e_set')),
                        forceDate(record_col8.value('e_exec')),
                        countRedDays=False,
                        eventTypeId=forceString(record_col8.value('et_id')),
                        isDayStationary=True)
                    sum_col8 += int(days_col8)

                while query.next():
                    record = query.record()
                    sumcol4 += int(forceString(record.value('discharge_Patients_SDP')))
                    sumcol7 += int(forceString(record.value('discharge_Patients_DS')))
                    sumcol6 += int(forceString(record.value('dead_SDP')))
                    sumcol9 += int(forceString(record.value('dead_DS')))

            sumDays_col5 += sum_col5
            sumDays_col8 += sum_col8

            table.setText(ii + 5, 4, sum_col5)
            table.setText(ii + 5, 7, sum_col8)

            sumPac_col4 += sumcol4
            sumPac_col7 += sumcol7
            sumOth_col6 += sumcol6
            sumOth_col9 += sumcol9
            table.setText(ii + 5, 3, sumcol4)
            table.setText(ii + 5, 5, sumcol6)
            table.setText(ii + 5, 6, sumcol7)
            table.setText(ii + 5, 8, sumcol9)

            ii = ii + 1

        '''
        sum of all the columns minus the last one (Z)
        '''
        if chkDenouement is False:
            sumPac_col4 -= int(sumcol4)
            sumDays_col5 -= int(days_col5)
            sumOth_col6 -= int(sumcol6)
            sumPac_col7 -= int(sumcol7)
            sumDays_col8 -= int(days_col8)
            sumOth_col9 -= int(sumcol9)

        table.setText(4, 3, sumPac_col4)
        table.setText(4, 4, sumDays_col5)
        table.setText(4, 5, sumOth_col6)
        table.setText(4, 6, sumPac_col7)
        table.setText(4, 7, sumDays_col8)
        table.setText(4, 8, sumOth_col9)

        self.merge_cells(table)
        return doc
    def build(self, params):
        noFinanceDetail = params.get('noFinanceDetail', False)

        db = QtGui.qApp.db
        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)
        cursor.setCharFormat(CReportBase.ReportTitle)
        cursor.insertText(self.title())
        cursor.insertBlock()
        self.dumpParams(cursor, params)
        cursor.insertBlock()
        tableColumns = [
            ('5%', [u'', u'', u'', u'', u''], CReportBase.AlignLeft),
            ('10%', [u'', u'', u'', u'', u''], CReportBase.AlignLeft),
            ('10%', [
                u'Движение больных за истекшие сутки',
                u'Состояло больных на начало текущих суток', u'', u'', u'1'
            ], CReportBase.AlignLeft),
            ('10%', [u'', u'Поступило больных', u'Всего', u'',
                     u'2'], CReportBase.AlignLeft),
            ('10%', [u'', u'', u'из них', u'пенсионеров',
                     u'3'], CReportBase.AlignLeft),
            ('10%', [u'', u'', u'из иногородних', u'всего',
                     u'4'], CReportBase.AlignLeft),
            ('10%', [u'', u'', u'', u'жителей села',
                     u'5'], CReportBase.AlignLeft),
            ('10%', [
                u'', u'Переведено больных внутри больницы',
                u'из других отделений', u'', u'6'
            ], CReportBase.AlignLeft),
            ('10%', [u'', u'', u'в другие отделения', u'',
                     u'7'], CReportBase.AlignLeft),
            ('5%', [u'', u'Выписано больных', u'', u'',
                    u'8'], CReportBase.AlignLeft),
            ('5%', [u'', u'Умерло', u'', u'', u'9'], CReportBase.AlignLeft),
            ('10%',
             [u'Состоит больных на начало текущего дня', u'', u'', u'',
              u'10'], CReportBase.AlignLeft)
        ]
        table = createTable(cursor, tableColumns)
        table.mergeCells(0, 0, 5, 1)
        table.mergeCells(0, 1, 5, 1)
        table.mergeCells(0, 2, 1, 9)
        table.mergeCells(1, 2, 3, 1)
        table.mergeCells(1, 3, 1, 4)
        table.mergeCells(2, 3, 2, 1)
        table.mergeCells(2, 5, 1, 2)
        table.mergeCells(1, 7, 1, 2)
        table.mergeCells(2, 7, 2, 1)
        table.mergeCells(2, 8, 2, 1)
        table.mergeCells(1, 9, 3, 1)
        table.mergeCells(1, 10, 3, 1)
        table.mergeCells(0, 11, 4, 1)

        (hospET, dayHospET, movingAT, receivedAT, leavedAT, movingCurOSAPT,
         movingFromOSAPT, movingToOSAPT, receivedCurOSAPT, leavedCurOSAPT,
         leavedOutcomeAPT, quoteAP, omsFinance, pmuFinance, dmsFinance,
         omsVmpFinance, omsLtFinance, akiFinance, budgetFinance,
         reanimationDepId, allReanimationsId) = loadIds()

        def getFinanceRow(rec):
            quotaClass = forceInt(rec.value('quotaClass')) if not rec.value(
                'quotaClass').isNull() else None
            financeID = forceInt(rec.value(
                'financeID')) if not rec.value('financeId').isNull() else None
            if quotaClass == 0:
                return 'vmp'
            if quotaClass == 1:
                return 'smp'
            if quotaClass == 7 or financeID == akiFinance:
                return 'aki'
            if financeID == omsFinance:
                return 'oms'
            if financeID == pmuFinance:
                return 'pmu'
            if financeID == dmsFinance:
                return 'dms'
            if financeID == omsVmpFinance and quotaClass == 5:
                return 'oms_vmp'
            if financeID == omsLtFinance:
                return 'oms_lt'
            if financeID == budgetFinance:
                return 'budget'
            QtGui.qApp.restoreOverrideCursor()
            res = QtGui.QMessageBox().warning(
                None, u'Не удалось определить тип финансирования',
                u'Код клиента: %s\nВнешний код: %s\nfinanceId: %s\nquotaClass: %s\n\n'
                u'Открыть обращение?' %
                (forceString(rec.value('cid')),
                 forceString(rec.value('externalId')), financeID, quotaClass),
                QtGui.QMessageBox.Yes | QtGui.QMessageBox.Retry
                | QtGui.QMessageBox.Cancel)
            if res == QtGui.QMessageBox.Yes:
                editEvent(None, forceRef(rec.value('eventId')))
            elif res == QtGui.QMessageBox.Retry:
                CArrivedDepartedPatients(None).exec_()
            raise ValueError

        def getEventType(rec):
            return 'ks' if forceRef(rec.value('eventType')) == hospET else 'ds'

        def getClientItem(rec):
            return '%s %s.%s. (%s)' % (forceString(rec.value('lastName')),
                                       forceString(rec.value('firstName'))[:1],
                                       forceString(rec.value('patrName'))[:1],
                                       forceString(rec.value('externalId')))

        # strType = '(type = 1 or type = 5)' if params['reanimation'] else 'type = 1'
        os_ids = params['LPU'] if not params['allLPU'] else \
            QtGui.qApp.db.getIdList('OrgStructure',
                                    where='(type = 1 or type = 5) AND hasHospitalBeds = 1 AND deleted = 0 AND '
                                          'EXISTS(SELECT oshb.id '
                                          '         FROM OrgStructure_HospitalBed oshb '
                                          '         WHERE oshb.master_id = OrgStructure.id)', order='code')

        finances = lambda: {
            'vmp': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            'smp': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            'oms': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            'pmu': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            'dms': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            'oms_vmp': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            'oms_lt': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            'aki': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            'budget': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            'total': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        }

        types = lambda: {
            'ks': finances(),
            'ds': finances(),
            'total': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        }

        names = lambda: {'ks': set(), 'ds': set()}

        OSdata = OrderedDict((os_id, types()) for os_id in os_ids)
        OSdata['total'] = types()

        received = names()
        leaved_alive = names()
        leaved_dead = names()
        moved_to_current = names()  # Переведено из других
        moved_from_current = names()  # Переведено в другие

        startDate = params['begDate'].toTime_t(
        )  # int(time.mktime(datetime.strptime('2017-04-04 00:00:00', '%Y-%m-%d %H:%M:%S').timetuple()))
        endDate = params['endDate'].toTime_t(
        )  # int(time.mktime(datetime.strptime('2017-04-04 23:59:59', '%Y-%m-%d %H:%M:%S').timetuple()))

        moving_sql = MOVING_QUERY.format(hospET=hospET,
                                         dayHospET=dayHospET,
                                         movingAT=movingAT,
                                         movingCurOSAPT=movingCurOSAPT,
                                         quoteAP=quoteAP,
                                         movingFromOSAPT=movingFromOSAPT,
                                         movingToOSAPT=movingToOSAPT,
                                         startDate=startDate,
                                         endDate=endDate)

        queryReanimation_sql = QUERY_REANIMATIONDEPARTMENT.format(
            hospET=hospET,
            dayHospET=dayHospET,
            movingAT=movingAT,
            quoteAP=quoteAP,
            startDate=startDate,
            endDate=endDate,
            reanimationDepId=reanimationDepId,
            allReanimationsId=allReanimationsId)

        transfer_sql = TRANSFER_QUERY.format(hospET=hospET,
                                             dayHospET=dayHospET,
                                             movingAT=movingAT,
                                             movingCurOSAPT=movingCurOSAPT,
                                             quoteAP=quoteAP,
                                             movingFromOSAPT=movingFromOSAPT,
                                             movingToOSAPT=movingToOSAPT,
                                             startDate=startDate,
                                             endDate=endDate)

        received_sql = RECEIVED_QUERY.format(hospET=hospET,
                                             dayHospET=dayHospET,
                                             receivedAT=receivedAT,
                                             receivedCurOSAPT=receivedCurOSAPT,
                                             movingAT=movingAT,
                                             quoteAP=quoteAP,
                                             startDate=startDate,
                                             endDate=endDate)

        leaved_sql = LEAVED_QUERY.format(hospET=hospET,
                                         dayHospET=dayHospET,
                                         leavedAT=leavedAT,
                                         leavedCurOSAPT=leavedCurOSAPT,
                                         leavedOutcomeAPT=leavedOutcomeAPT,
                                         movingAT=movingAT,
                                         quoteAP=quoteAP,
                                         startDate=startDate,
                                         endDate=endDate)

        self.setQueryText(';\n'.join((moving_sql, received_sql, leaved_sql,
                                      transfer_sql, queryReanimation_sql)) +
                          ';')

        def inc(os, rec, column):
            financeRow = getFinanceRow(rec)
            eventType = getEventType(rec)
            OSdata[os]['total'][column] += 1
            OSdata[os][eventType]['total'][column] += 1
            OSdata[os][eventType][financeRow][column] += 1
            OSdata['total']['total'][column] += 1
            OSdata['total'][eventType]['total'][column] += 1
            OSdata['total'][eventType][financeRow][column] += 1

        try:
            if params['reanimation']:
                for rec in db.iterRecordList(stmt=transfer_sql):
                    recBegDate = forceLong(rec.value('begUNIX'))
                    recEndDate = forceLong(rec.value('endUNIX'))
                    recCurrentOS = forceRef(rec.value('currentOS'))
                    if startDate <= recBegDate <= endDate and recCurrentOS in OSdata.keys(
                    ):
                        moved_to_current[getEventType(rec)].add(
                            getClientItem(rec))
                        inc(recCurrentOS, rec, MOVED_TO_CURRENT)
                    if startDate <= recEndDate <= endDate and recCurrentOS in OSdata.keys(
                    ):
                        moved_from_current[getEventType(rec)].add(
                            getClientItem(rec))
                        inc(recCurrentOS, rec, MOVED_FROM_CURRENT)

            for rec in db.iterRecordList(stmt=queryReanimation_sql):
                recBegDate = forceLong(rec.value('begDate'))
                recEndDate = forceLong(rec.value('endDate'))
                recCurrentOS = forceRef(rec.value('currentOS'))
                endDateIndicator = forceInt(rec.value('endDateIndicator'))
                # moreThan2H = forceInt(rec.value('moreThan2H'))
                # if endDateIndicator == moreThan2H:
                if (
                        rec.value('endDate').isNull()
                        or recEndDate > recBegDate
                ) and recBegDate < startDate and recCurrentOS in OSdata.keys():
                    #startDate <= recBegDate <= endDate
                    inc(recCurrentOS, rec, START_COUNT)
                if startDate <= recBegDate <= endDate and recCurrentOS in OSdata.keys(
                ):
                    moved_to_current[getEventType(rec)].add(getClientItem(rec))
                    inc(recCurrentOS, rec, MOVED_TO_CURRENT)
                if (startDate <= recEndDate <=
                        endDate) and recCurrentOS in OSdata.keys():
                    moved_from_current[getEventType(rec)].add(
                        getClientItem(rec))
                    inc(recCurrentOS, rec, MOVED_FROM_CURRENT)
                if (
                        rec.value('endDate').isNull() or recEndDate > endDate
                ) and recBegDate <= endDate and recCurrentOS in OSdata.keys():
                    inc(recCurrentOS, rec, END_COUNT)

            for rec in db.iterRecordList(stmt=moving_sql):
                recBegDate = forceLong(rec.value('begDate'))
                recEndDate = forceLong(rec.value('endDate'))
                recCurrentOS = forceRef(rec.value('currentOS'))
                recFromOS = forceRef(rec.value('fromOS'))
                recToOS = forceRef(rec.value('toOS'))
                if (recBegDate <= startDate and
                    (recEndDate >= startDate or rec.value('endDate').isNull())
                        and recCurrentOS in OSdata.keys()):
                    inc(recCurrentOS, rec, START_COUNT)
                if (recBegDate <= endDate and
                    (recEndDate >= endDate or rec.value('endDate').isNull())
                        and recCurrentOS in OSdata.keys()):
                    inc(recCurrentOS, rec, END_COUNT)
                # переведены в указанные отделения
                if (startDate <= recEndDate <= endDate
                        and recCurrentOS is not None
                        and recToOS in OSdata.keys()):
                    moved_to_current[getEventType(rec)].add(getClientItem(rec))
                    inc(recToOS, rec, MOVED_TO_CURRENT)
                # переведены из указанных отделений
                if (startDate <= recBegDate <= endDate
                        and recCurrentOS is not None
                        and recFromOS in OSdata.keys()):
                    moved_from_current[getEventType(rec)].add(
                        getClientItem(rec))
                    inc(recFromOS, rec, MOVED_FROM_CURRENT)

            for rec in db.iterRecordList(stmt=received_sql):
                recIsVillager = forceBool(rec.value('isVillager'))
                recIsForeigner = forceBool(rec.value('isForeigner'))
                recIsPensioner = forceBool(rec.value('isPensioner'))
                recCurrentOS = forceRef(rec.value('currentOS'))
                recEndDate = forceLong(rec.value('endDate'))
                if (startDate <= recEndDate <= endDate
                        and recCurrentOS in OSdata.keys()):
                    inc(recCurrentOS, rec, RECEIVED_TOTAL)
                    received[getEventType(rec)].add(getClientItem(rec))
                    if recIsPensioner:
                        inc(recCurrentOS, rec, RECEIVED_PENSIONER)
                    if recIsForeigner:
                        inc(recCurrentOS, rec, RECEIVED_FOREIGN)
                    if recIsVillager:
                        inc(recCurrentOS, rec, RECEIVED_VILLAGER)

            for rec in db.iterRecordList(stmt=leaved_sql):
                recBegDate = forceLong(rec.value('begDate'))
                recCurrentOS = forceRef(rec.value('currentOS'))
                recIsDeath = forceString(rec.value('outcome')) == u'умер'
                if startDate <= recBegDate <= endDate and recCurrentOS in OSdata.keys(
                ):
                    if recIsDeath:
                        leaved_dead[getEventType(rec)].add(getClientItem(rec))
                        inc(recCurrentOS, rec, LEAVED_DEAD)
                    else:
                        leaved_alive[getEventType(rec)].add(getClientItem(rec))
                        inc(recCurrentOS, rec, LEAVED_ALIVE)
        except ValueError:
            return None

        def write_event_type(os_id, is_ks=True):
            et = 'ks' if is_ks else 'ds'
            if not noFinanceDetail:
                row = table.addRowWithContent(u'', u'ВМП',
                                              *OSdata[os_id][et]['vmp'])
                table.addRowWithContent(u'', u'СМП', *OSdata[os_id][et]['smp'])
                table.addRowWithContent(u'', u'ОМС', *OSdata[os_id][et]['oms'])
                table.addRowWithContent(u'', u'ПМУ', *OSdata[os_id][et]['pmu'])
                table.addRowWithContent(u'', u'ДМС', *OSdata[os_id][et]['dms'])
                table.addRowWithContent(u'', u'ВМП из ОМС',
                                        *OSdata[os_id][et]['oms_vmp'])
                table.addRowWithContent(u'', u'ОМС ЛТ',
                                        *OSdata[os_id][et]['oms_lt'])
                table.addRowWithContent(u'', u'АКИ', *OSdata[os_id][et]['aki'])
                table.addRowWithContent(u'', u'Донор/Прочее',
                                        *OSdata[os_id][et]['budget'])
            table.addRowWithContent(u'КС' if is_ks else u'ДС',
                                    u'Итого',
                                    *OSdata[os_id][et]['total'],
                                    charFormat=self.boldFormat)
            if not noFinanceDetail:
                table.mergeCells(row, 0, 10, 1)

        for os_id in OSdata.keys():
            if os_id == 'total':
                if len(os_ids) == 1:
                    continue
                os_code = u'все подразделения'
            else:
                os_code = forceString(
                    db.translate('OrgStructure', 'id', os_id, 'code'))
            row = table.addRowWithContent(os_code)
            table.mergeCells(row, 0, 1, 12)
            write_event_type(os_id)
            write_event_type(os_id, False)
            row = table.addRowWithContent(u'Итого ' + os_code,
                                          u'',
                                          *OSdata[os_id]['total'],
                                          charFormat=self.boldFormat)
            table.mergeCells(row, 0, 1, 2)

        if noFinanceDetail:
            table.table.removeColumns(1, 1)

        cursor.movePosition(QtGui.QTextCursor.End)
        cursor.insertBlock()
        cursor.insertText(
            u'\nДежурная медсестра: _____________________________________')
        cursor.insertBlock()

        if not params['allLPU']:

            def insertClientList(lst, row, col):
                table.setHtml(
                    row, col,
                    u'<ol><li>' + u'</li><li>'.join(lst) + u'</li></ol>')

            def insertClientsRow(et):
                table.addRow()
                insertClientList(received[et], 1, 0)
                insertClientList(leaved_alive[et], 1, 1)
                insertClientList(leaved_dead[et], 1, 2)
                insertClientList(moved_to_current[et], 1, 3)
                insertClientList(moved_from_current[et], 1, 4)

            tableColumns = [
                ('20%', [u'Поступило:'], CReport.AlignLeft),
                ('20%', [u'Выписано:'], CReport.AlignLeft),
                ('20%', [u'Умерло:'], CReport.AlignLeft),
                ('20%', [u'Переведено из:'], CReport.AlignLeft),
                ('20%', [u'Переведено в:'], CReport.AlignLeft),
            ]

            cursor.insertText(u'\n\nГоспитализация', CReport.ReportSubTitle)
            textFormat = QtGui.QTextBlockFormat()
            textFormat.setPageBreakPolicy(
                QtGui.QTextBlockFormat.PageBreak_AlwaysBefore)
            cursor.setBlockFormat(textFormat)
            cursor.insertBlock()
            textFormat.setPageBreakPolicy(
                QtGui.QTextBlockFormat.PageBreak_Auto)
            cursor.setBlockFormat(textFormat)

            table = createTable(cursor, tableColumns, border=0, cellPadding=0)
            insertClientsRow('ks')
            cursor.movePosition(QtGui.QTextCursor.End)

            cursor.insertBlock()
            cursor.insertText(u'\n\nДС Госпитализация', CReport.ReportSubTitle)
            cursor.insertBlock()
            table = createTable(cursor, tableColumns, border=0, cellPadding=0)
            table.table.format().setAlignment(QtCore.Qt.AlignTop)
            insertClientsRow('ds')

        return doc