Esempio n. 1
0
 def loadPreferences(self, preferences):
     model = self.model()
     for i in xrange(model.columnCount()):
         width = forceInt(getPref(preferences, 'col_' + str(i), None))
         if width:
             self.setColumnWidth(i, width)
Esempio n. 2
0
    def setData(self, index, value, role=QtCore.Qt.EditRole):
        if not index.isValid():
            return False

        row = index.row()
        column = index.column()
        rowCount = self.rowCount()
        if row not in xrange(rowCount):
            return False

        if self._editable and row == (rowCount - 1):
            self.beginInsertRows(index.parent(), row, row)
            self._items.append(CCheckItem(payStatus=None))
            self.endInsertRows()

        if role == QtCore.Qt.CheckStateRole and column == self.columnInfo[
                'name']['index']:
            item = self.items()[row]
            item.isSelected = (value != QtCore.Qt.Unchecked)
            checkResult, checkMessage, canIgnore = self.checkItemSelect(item)
            if not checkResult:
                buttons = QtGui.QMessageBox.Ok
                if canIgnore:
                    buttons |= QtGui.QMessageBox.Ignore
                userChoise = QtGui.QMessageBox.warning(
                    QtGui.qApp.activeWindow(),
                    u'Внимание!',
                    checkMessage,
                    buttons=buttons,
                    defaultButton=QtGui.QMessageBox.Ok)
                if userChoise == QtGui.QMessageBox.Ok:
                    item.isSelected = not item.isSelected
                    return False
            self.dataChanged.emit(index, index)
            return True

        if role == QtCore.Qt.EditRole and self._editable:
            item = self.items()[row]
            sumIndex = self.index(index.row(), self.columnInfo['sum']['index'])
            if column == self.columnInfo['name']['index']:
                item.name = forceString(value)
                self.dataChanged.emit(index, index)
                return True
            elif column == self.columnInfo['quantity']['index']:
                newValue = forceDecimal(value)
                if newValue < forceDecimal(0):
                    return False
                item.quantity = newValue
                self.dataChanged.emit(index, sumIndex)
                return True
            elif column == self.columnInfo['price']['index']:
                newValue = forceDecimal(value)
                if newValue < forceDecimal(0):
                    return False
                item.price = newValue
                self.dataChanged.emit(index, sumIndex)
                return True
            elif column == self.columnInfo['discount']['index']:
                newValue = forceDecimal(value)
                if newValue <= CCheckItem.precision:
                    newValue = forceDecimal(0)
                item.discountType = CCashRegisterDriverInfo.DiscountType.percent
                item.discountValue = forceDecimal(value)
                return True
            elif column == self.columnInfo['vat']['index']:
                item.vat = forceInt(value)
                return True
        return False
Esempio n. 3
0
 def idList(self):
     idList = []
     for item in self._items:
         idList.append(forceInt(item.value('id')))
     return idList
Esempio n. 4
0
    def build(self, params):
        doc = QtGui.QTextDocument()

        cursor = QtGui.QTextCursor(doc)
        cursor.setCharFormat(CReportBase.ReportTitle)
        cursor.insertText(
            u'Проверка результатов лечения и обращения в событии')
        cursor.insertBlock()
        self.dumpParams(cursor, params)
        cursor.insertBlock()

        tableColumns = [
            ('3%', [u'№ п/п'], CReportBase.AlignLeft),
            ('5%', [u'Код пациента'], CReportBase.AlignLeft),
            ('20%', [u'ФИО пациента'], CReportBase.AlignLeft),
            ('10%', [u'Дата рождения'], CReportBase.AlignLeft),
            ('10%', [u'Период лечения'], CReportBase.AlignLeft),
            ('20%', [u'Врач'], CReportBase.AlignLeft),
            ('10%', [u'Подразделение'], CReportBase.AlignLeft),
            ('10%', [u'Контроль'], CReportBase.AlignLeft),
        ]
        table = createTable(cursor, tableColumns)

        query = selectData(params)
        self.setQueryText(forceString(query.lastQuery()))

        # ep - eventProfileCode, r - resultCode, dr - diagnosticResultCode
        checks = [
            (u'Результат лечения не соответствует условию оказания мед помощи',
             lambda ep, r, dr: ep in ['11', '12', '301', '302', '401', '402']
             and dr not in [str(x) for x in range(101, 106)] or ep in [
                 '41', '42', '43', '51', '52', '71', '72', '90'
             ] and dr not in [str(x) for x in range(201, 206)] or ep in [
                 '01', '02', '21', '22', '31', '32', '60', '111', '112', '201',
                 '202', '211', '232', '241', '242', '252', '261', '262'
             ] and dr not in [str(x) for x in range(301, 308)] or ep in
             ['801', '802'] and dr not in [str(x) for x in range(401, 405)]),
            (u'Результат обращения не соответствует условию оказания мед помощи',
             lambda ep, r, dr: ep in ['11', '12', '301', '302', '401', '402']
             and r not in [str(x) for x in range(101, 111)] or ep in [
                 '41', '42', '43', '51', '52', '71', '72', '90'
             ] and r not in [str(x) for x in range(201, 209)] or ep in [
                 '01', '02', '21', '22', '31', '32', '60', '111', '112', '201',
                 '202', '211', '232', '241', '242', '252', '261', '262'
             ] and r not in [str(x) for x in range(301, 317)] or ep in
             ['801', '802'] and dr not in [str(x) for x in range(401, 417)]),
            (u'Результат лечения не применяется для диспансеризации',
             lambda ep, r, dr: ep in ['211', '232', '252', '261', '262'
                                      ] and dr not in ['304', '306']),
            (u'Результат обращения не применяется для диспансеризации взрослого населения',
             lambda ep, r, dr: ep in ['211', '261'] and r not in
             ['317', '318', '355', '356']),
            (u'Результат обращения не применяется для диспансеризации детского населения',
             lambda ep, r, dr: ep in ['232', '252', '262'] and r not in
             ['317', '318', '319', '320', '321'])
        ]

        while query.next():
            record = query.record()
            eventProfileCode = forceString(record.value('eventProfileCode'))
            resultCode = forceString(record.value('resultCode'))
            diagnosticResultCode = forceString(
                record.value('diagnosticResultCode'))
            if any([
                    check[1](eventProfileCode, resultCode,
                             diagnosticResultCode) for check in checks
            ]):
                i = table.addRow()
                table.setText(i, 0, i)
                table.setText(i, 1, forceString(record.value('clientId')))
                table.setText(i, 2, forceString(record.value('clientName')))
                table.setText(i, 3, forceString(record.value('birthDate')))
                table.setText(
                    i, 4,
                    forceDate(record.value('setDate')).toString('dd.MM.yyyy') +
                    '-' +
                    forceDate(record.value('execDate')).toString('dd.MM.yyyy'))
                table.setText(i, 5, forceString(record.value('person')))
                table.setText(
                    i, 6,
                    getOrgStructureFullName(
                        forceInt(record.value('orgStructure_id'))))
                table.setText(
                    i, 7, u'\n'.join([
                        check[0] for check in checks if check[1](
                            eventProfileCode, resultCode, diagnosticResultCode)
                    ]))

        return doc
Esempio n. 5
0
    def prepareActions(self, presetActions, disabledActions, actionTypeIdValue,
                       valueProperties, diagnos, financeId, protocolQuoteId,
                       actionByNewEvent):
        def addActionType(actionTypeId, amount, idListActionType,
                          idListActionTypeIPH, actionFinance,
                          idListActionTypeMoving):
            for model in [self.actionPage.modelAPActions]:
                if actionTypeId in model.actionTypeIdList:
                    if actionTypeId in idListActionType and not actionByNewEvent:
                        model.addRow(actionTypeId, amount)
                        record, action = model.items()[-1]
                        action[
                            u'Направлен в отделение']  #atronah: для инициализации этого Property, чтобы при сохранении оно записалось хотя бы со значением по умолчанию =)
                        if valueProperties and len(
                                valueProperties) > 0 and valueProperties[0]:
                            action[u'Направлен в отделение'] = valueProperties[
                                0]
                        if protocolQuoteId:
                            action[u'Квота'] = protocolQuoteId
                        if actionFinance == 0:
                            record.setValue('finance_id', toVariant(financeId))
                    elif actionTypeId in idListActionTypeIPH:
                        model.addRow(actionTypeId, amount)
                        record, action = model.items()[-1]
                        if diagnos:
                            record, action = model.items()[-1]
                            action[u'Диагноз'] = diagnos
                    # [self.eventActionFinance, self.receivedFinanceId, orgStructureTransfer, orgStructurePresence, oldBegDate, movingQuoting, personId]
                    elif actionByNewEvent and actionTypeId in idListActionTypeMoving:
                        model.addRow(actionTypeId, amount)
                        record, action = model.items()[-1]
                        if actionByNewEvent[0] == 0:
                            record.setValue('finance_id',
                                            toVariant(actionByNewEvent[1]))
                        action[u'Отделение пребывания'] = actionByNewEvent[2]
                        action[
                            u'Переведен из отделения']  #atronah: для инициализации этого Property, чтобы при сохранении оно записалось хотя бы со значением по умолчанию =)
                        if actionByNewEvent[3]:
                            action[
                                u'Переведен из отделения'] = actionByNewEvent[
                                    3]
                        if actionByNewEvent[4]:
                            record.setValue('begDate',
                                            toVariant(actionByNewEvent[4]))
                        else:
                            record.setValue(
                                'begDate',
                                toVariant(QtCore.QDateTime.currentDateTime()))
                        if action.getType().containsPropertyWithName(
                                u'Квота') and actionByNewEvent[5]:
                            action[u'Квота'] = actionByNewEvent[5]
                        if actionByNewEvent[6]:
                            record.setValue('person_id',
                                            toVariant(actionByNewEvent[6]))
                    elif (actionByNewEvent and actionTypeId
                          not in idListActionType) or not actionByNewEvent:
                        model.addRow(actionTypeId, amount)
                        record, action = model.items()[-1]

        def disableActionType(actionTypeId):
            for model in [
                    self.tabStatus.modelAPActions,
                    self.tabDiagnostic.modelAPActions,
                    self.tabCure.modelAPActions, self.tabMisc.modelAPActions
            ]:
                if actionTypeId in model.actionTypeIdList:
                    model.disableActionType(actionTypeId)
                    break

        if disabledActions:
            for actionTypeId in disabledActions:
                disableActionType(actionTypeId)
        if presetActions:
            db = QtGui.qApp.db
            tableActionType = db.table('ActionType')
            tableEventType = db.table('EventType')
            idListActionType = db.getIdList(
                tableActionType, [tableActionType['id']], [
                    tableActionType['flatCode'].like(u'received%'),
                    tableActionType['deleted'].eq(0)
                ])
            idListActionTypeIPH = db.getIdList(
                tableActionType, [tableActionType['id']], [
                    tableActionType['flatCode'].like(u'inspectPigeonHole%'),
                    tableActionType['deleted'].eq(0)
                ])
            idListActionTypeMoving = db.getIdList(
                tableActionType, [tableActionType['id']], [
                    tableActionType['flatCode'].like(u'moving%'),
                    tableActionType['deleted'].eq(0)
                ])
            eventTypeId = self.getEventTypeId()
            actionFinance = None
            if eventTypeId:
                recordET = db.getRecordEx(
                    tableEventType, [tableEventType['actionFinance']], [
                        tableEventType['deleted'].eq(0),
                        tableEventType['id'].eq(eventTypeId)
                    ])
                actionFinance = forceInt(
                    recordET.value('actionFinance')) if recordET else None
            if actionByNewEvent:
                actionTypeMoving = False
                for actionTypeId, amount, _, orgId in presetActions:
                    if actionTypeId in idListActionTypeMoving:
                        actionTypeMoving = True
                        break
                if not actionTypeMoving and idListActionTypeMoving:
                    presetActions.append(
                        (idListActionTypeMoving[0], 1.0, False))
            for actionTypeId, amount, cash, orgId in presetActions:
                addActionType(actionTypeId, amount, idListActionType,
                              idListActionTypeIPH, actionFinance,
                              idListActionTypeMoving)
Esempio n. 6
0
 def writePatientPerson(self, record):
     self.writeStartElement('patientPerson')
     self.writeStartElement('name')
     self.writeTextElement('family', forceString(record.value('lastName')))
     self.writeTextElement('given', forceString(record.value('firstName')))
     if forceString(record.value('patrName')):
         self.writeTextElement('given',
                               forceString(record.value('patrName')))
     self.writeEndElement()
     if forceString(record.value('clientContact')) and forceString(
             record.value('contactTypeCode')):
         contactType = forceInt(record.value('contactTypeCode'))
         if contactType == 4:
             type = u'mailto:'
         else:
             type = u'tel:'
         self.writeStartElement('telecom')
         self.writeAttribute(
             'value', type + forceString(record.value('clientContact')))
         self.writeEndElement()
     self.writeStartElement('administrativeGenderCode')
     self.writeAttribute('code', forceString(record.value('sex')))
     self.writeAttribute('codeSystem', u'1.2.643.5.1.13.2.1.1.156')
     self.writeEndElement()
     self.writeStartElement('birthTime')
     if forceTime(record.value('birthTime')).toString('hhmmss') != '000000':
         self.writeAttribute(
             'value',
             forceDate(record.value('birthDate')).toString('yyyyMMdd') +
             forceTime(record.value('birthTime')).toString('hhmmss'))
     else:
         self.writeAttribute(
             'value',
             forceDate(record.value('birthDate')).toString('yyyyMMdd'))
     self.writeEndElement()
     KLADRCode = forceString(record.value('KLADRCode'))
     KLADRStreetCode = forceString(record.value('KLADRStreetCode'))
     freeInput = forceString(record.value('freeInput'))
     if freeInput or KLADRCode:
         self.writeStartElement('addr')
         if forceInt(record.value('KLADRCode')) and forceInt(
                 record.value('KLADRStreetCode')):
             houseNumber = forceString(record.value('houseNumber'))
             houseCorpus = forceString(record.value('corpus'))
             flat = forceString(record.value('flat'))
             if KLADRCode:
                 self.writeTextElement('country', u'Российская Федерация')
                 region = getMainRegionName(KLADRCode)
                 city = getCityName(KLADRCode)
                 # FIXME: лучше, наверное, определять города федерального подчинения по полю STATUS в кладре.
                 if region != city:
                     self.writeTextElement('state', region)
                 self.writeTextElement('city', city)
                 self.writeTextElement('unitID', KLADRCode)
             #FIXME: если выгрузка будет медленно работать, возможно стоит заменить getStreetName на обработку полей из уже имеющегося запроса
             if KLADRStreetCode:
                 self.writeTextElement('streetName',
                                       getStreetName(KLADRStreetCode))
             if houseNumber:
                 self.writeTextElement('houseNumber', houseNumber)
             # FIXME: что делать с корпусом???
             if flat:
                 self.writeTextElement('additionalLocator', flat)
         if freeInput:
             self.writeTextElement('streetAddressLine', freeInput)
         self.writeEndElement()
     self.writeComment(u'социальный статус')
     #self.writeAsMemberSoc(record)
     self.writeComment(u'льготная категория населения')
     #self.writeAsMemberFacilities(record)
     self.writeComment(u'СНИЛС')
     if forceString(record.value('SNILS')):
         self.writeAsOtherDsSNILS(record)
     self.writeComment(u'ОМС')
     if forceString(record.value('policyNumber')) and forceString(record.value('policySerial')) and forceString(record.value('insurerName'))\
             or forceString(record.value('policyNumber')) and forceString(record.value('policySerial')):
         self.writeAsOtherDsOMS(record)
     self.writeComment(u'паспорт')
     if forceString(record.value('documentNumber')) and forceString(record.value('documentSerial')) and forceString(record.value('documentOrg'))\
             or forceString(record.value('documentNumber')) and forceString(record.value('documentSerial')):
         self.writeAsOtherDsPass(record)
     self.writeComment(u'место рождения')
     #self.writeBirthPlace(record)
     self.writeEndElement()
Esempio n. 7
0
    def build(self, params):
        begDate = params.get('begDate')
        endDate = params.get('endDate')

        query = selectData(begDate, endDate)
        self.setQueryText(forceString(query.lastQuery()))
        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)
        cursor.setCharFormat(CReportBase.ReportTitle)
        cursor.insertText(self.title())
        cursor.insertBlock()
        self.dumpParams(cursor, params)
        cursor.insertBlock()
        tableColumns = [
            ('2%', [u'Степень тяжести заболевания'], CReportBase.AlignLeft),
            ('15%', [u'Выбыло человек', u'', u'Всего'], CReportBase.AlignLeft),
            ('10%', [u'', u'', u'Умерло'], CReportBase.AlignLeft),
            ('15%', [u'Не оперировано человек', u'',
                     u'Всего'], CReportBase.AlignLeft),
            ('10%', [u'', u'', u'Умерло'], CReportBase.AlignLeft),
            ('10%', [u'Оперировано человек', u'Всего'], CReportBase.AlignLeft),
            ('10%', [u'', u'Умерло'], CReportBase.AlignLeft),
            ('5%', [u'', u'В срок до 7 суток',
                    u'Всего'], CReportBase.AlignLeft),
            ('5%', [u'', u'', u'Умерло'], CReportBase.AlignLeft),
            ('5%', [u'', u'Позднее 7 суток', u'Всего'], CReportBase.AlignLeft),
            ('10%', [u'', u'', u'Умерло'], CReportBase.AlignLeft)
        ]
        table = createTable(cursor, tableColumns)
        table.mergeCells(0, 0, 3, 1)  #Степень тяжески заболевания
        table.mergeCells(0, 1, 2, 2)  #Выбыло человек
        table.mergeCells(0, 3, 2, 2)  #Не оперировано человек
        table.mergeCells(0, 5, 1, 6)  #Оперировано человек
        table.mergeCells(1, 5, 2, 1)  #Всего
        table.mergeCells(1, 6, 2, 1)  #Умерло
        table.mergeCells(1, 7, 1, 2)  #В срок до 7 суток
        table.mergeCells(1, 9, 1, 2)  #Позднее 7 суток
        rows = [u'Легкая', u'Средняя', u'Тяжелая']
        while query.next():
            record = query.record()
            leaved = forceInt(record.value('leaved'))
            leavedDeath = forceInt(record.value('leavedDeath'))
            notOperation = forceInt(record.value('notOperation'))
            notOperationDeath = forceInt(record.value('notOperationDeath'))
            operation = forceInt(record.value('operation'))
            operationDeath = forceInt(record.value('operationDeath'))
            operationBefore = forceInt(record.value('operationBefore'))
            operationDeathBefore = forceInt(
                record.value('operationDeathBefore'))
            operationAfter = forceInt(record.value('operationAfter'))
            operationDeathAfter = forceInt(record.value('operationDeathAfter'))
            i = table.addRow()
            table.setText(i, 0, rows[i - 3])
            table.setText(i, 1, leaved)
            table.setText(i, 2, leavedDeath)
            table.setText(i, 3, notOperation)
            table.setText(i, 4, notOperationDeath)
            table.setText(i, 5, operation)
            table.setText(i, 6, operationDeath)
            table.setText(i, 7, operationBefore)
            table.setText(i, 8, operationDeathBefore)
            table.setText(i, 9, operationAfter)
            table.setText(i, 10, operationDeathAfter)
        return doc
Esempio n. 8
0
    def build(self, params):
        begDate = params.get('begDate')
        endDate = params.get('endDate')
        partner = params.get('partner')
        isValid = params.get('isValid')
        orgStruct = params.get('orgStruct')
        researcher = params.get('researcher')
        isEnrollment = params.get('enrollment')

        query = selectFinanceData(begDate, endDate, partner, isValid,
                                  orgStruct, researcher, isEnrollment)
        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)
        cursor.setCharFormat(CReportBase.ReportTitle)
        cursor.insertText(self.title())
        cursor.insertBlock()
        self.dumpParams(cursor, params)
        cursor.insertBlock()
        tableColumns = [
            ('10%', [u'Подразделение'], CReportBase.AlignLeft),
            ('10%', [u'Главный исследователь'], CReportBase.AlignLeft),
            ('20%', [u'Контрагент'], CReportBase.AlignLeft),
            ('10%', [u'Номер договора'], CReportBase.AlignLeft),
            ('10%', [u'Номер протокола'], CReportBase.AlignLeft),
            ('10%', [u'Действующий'], CReportBase.AlignLeft),
            ('10%', [u'Сумма выписанных услуг'], CReportBase.AlignLeft),
            ('10%', [u'Сумма выставленных счетов'], CReportBase.AlignLeft),
            ('10%', [u'Сумма не выставленных счетов'], CReportBase.AlignLeft),
            ('10%', [u'Сумма не оплаченных счетов'], CReportBase.AlignLeft)
        ]
        table = createTable(cursor, tableColumns)
        table.mergeCells(0, 0, 1, 1)  # Подразделение
        table.mergeCells(0, 0, 1, 1)  # Главный исследователь
        table.mergeCells(0, 0, 1, 1)  # Контрагент
        table.mergeCells(0, 0, 1, 1)  # Номер договора
        table.mergeCells(0, 0, 1, 1)  # Номер протокола
        table.mergeCells(0, 0, 1, 1)  # Действующий
        table.mergeCells(0, 0, 1, 1)  # Сумма выписанных услуг
        table.mergeCells(0, 0, 1, 1)  # Сумма выставленных счетов
        table.mergeCells(0, 0, 1, 1)  # Сумма не выставленных счетов
        table.mergeCells(0, 0, 1, 1)  # Сумма не оплаченных счетов
        while query.next():
            record = query.record()
            i = table.addRow()
            recPerson = self.db.getRecordEx(
                self.tblPrson, '*',
                self.tblPrson['id'].eq(forceInt(record.value('person_id'))))
            table.setText(
                i, 0,
                forceString(
                    self.db.translate(
                        self.tblOrgStruct, self.tblOrgStruct['id'],
                        forceInt(record.value('orgStructure_id')),
                        self.tblOrgStruct['name'])))
            table.setText(
                i, 1,
                forceString(
                    forceString(recPerson.value('lastName')) + u' ' +
                    forceString(recPerson.value('firstName')) + u' ' +
                    forceString(recPerson.value('patrName'))))
            table.setText(
                i, 2,
                forceString(
                    self.db.translate(self.tblOrganisation,
                                      self.tblOrganisation['id'],
                                      forceInt(record.value('org_id')),
                                      self.tblOrganisation['shortName'])))
            table.setText(i, 3, forceString(record.value('number')))
            table.setText(i, 4, forceString(record.value('numberProtocol')))
            table.setText(
                i, 5, u'Действующий' if forceDate(record.value('endDate')) >
                QtCore.QDate.currentDate() else u'Недействующий')
            table.setText(i, 6, forceDecimal(record.value('sumUsl')))
            table.setText(i, 7, forceDecimal(record.value('sumAcc')))
            table.setText(i, 8, forceDecimal(record.value('sumNotAcc')))
            table.setText(i, 9, forceDecimal(record.value('sumNotPayed')))
        return doc
Esempio n. 9
0
    def build(self, params):
        begDate = params.get('begDate')
        endDate = params.get('endDate')
        partner = params.get('partner')
        isValid = params.get('isValid')
        orgStruct = params.get('orgStruct')
        researcher = params.get('researcher')
        isEnrollment = params.get('enrollment')

        query = selectData(begDate, endDate, partner, isValid, orgStruct,
                           researcher, isEnrollment)
        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)
        cursor.setCharFormat(CReportBase.ReportTitle)
        cursor.insertText(self.title())
        cursor.insertBlock()
        self.dumpParams(cursor, params)
        cursor.insertBlock()
        tableColumns = [
            ('10%', [u'Подразделение'], CReportBase.AlignLeft),
            ('10%', [u'Главный исследователь'], CReportBase.AlignLeft),
            ('10%', [u'Номер договора'], CReportBase.AlignLeft),
            ('10%', [u'Дата заключения'], CReportBase.AlignLeft),
            ('10%', [u'Дата окончания'], CReportBase.AlignLeft),
            ('20%', [u'Контрагент'], CReportBase.AlignLeft),
            ('10%', [u'Номер протокола'], CReportBase.AlignLeft),
            ('20%', [u'Название протокола'], CReportBase.AlignLeft),
            ('10%', [u'Действующий'], CReportBase.AlignLeft),
            ('10%', [u'Набор пациентов'], CReportBase.AlignLeft)
        ]
        table = createTable(cursor, tableColumns)
        table.mergeCells(0, 0, 1, 1)  #Подразделение
        table.mergeCells(0, 0, 1, 1)  #Главный исследователь
        table.mergeCells(0, 0, 1, 1)  #Номер договора
        table.mergeCells(0, 0, 1, 1)  #Дата заключения
        table.mergeCells(0, 0, 1, 1)  #Дата окончания
        table.mergeCells(0, 0, 1, 1)  #Контрагент
        table.mergeCells(0, 0, 1, 1)  #Номер протокола
        table.mergeCells(0, 0, 1, 1)  #Название протокола
        table.mergeCells(0, 0, 1, 1)  #Действующий
        table.mergeCells(0, 0, 1, 1)  #Набор пациентов
        for record in query:
            i = table.addRow()
            recPerson = self.db.getRecordEx(
                self.tblPrson, '*',
                self.tblPrson['id'].eq(forceInt(record.value('person_id'))))
            table.setText(
                i, 0,
                forceString(
                    self.db.translate(
                        self.tblOrgStruct, self.tblOrgStruct['id'],
                        forceInt(record.value('orgStructure_id')),
                        self.tblOrgStruct['name'])))
            table.setText(
                i, 1,
                forceString(
                    forceString(recPerson.value('lastName')) + u' ' +
                    forceString(recPerson.value('firstName')) + u' ' +
                    forceString(recPerson.value('patrName'))))
            table.setText(i, 2, forceString(record.value('number')))
            table.setText(i, 3, forceString(record.value('begDate')))
            table.setText(i, 4, forceString(record.value('endDate')))
            table.setText(
                i, 5,
                forceString(
                    self.db.translate(self.tblOrganisation,
                                      self.tblOrganisation['id'],
                                      forceInt(record.value('org_id')),
                                      self.tblOrganisation['shortName'])))
            table.setText(i, 6, forceString(record.value('numberProtocol')))
            table.setText(i, 7, forceString(record.value('nameProtocol')))
            table.setText(
                i, 8, u'Действующий' if forceDate(record.value('endDate')) >
                QtCore.QDate.currentDate() else u'Недействующий')
            table.setText(
                i, 9, u'Идет'
                if not forceInt(record.value('enrollment')) else u'не идет')
        return doc
Esempio n. 10
0
    def build(self, params):
        rowNameSet = [
            [
                u'Психические расстройства (всего)', u'F00-F09, F20-F99', u'1',
                [
                    'F0%', 'F2%', 'F3%', 'F4%', 'F5%', 'F6%', 'F7%', 'F8%',
                    'F9%'
                ], '', ''
            ],
            [
                u'Психозы и состояния слабоумия',
                u'F00-F05, F06(часть), F09, F20-25, F28, F29, F3x.x4, F30-F39(часть), F80.31, F84.0-.4, F99.1',
                u'2',
                [
                    'F00%', 'F01%', 'F02%', 'F03%', 'F04%', 'F05%', 'F09%',
                    'F06.0%', 'F06.1%', 'F06.2%', 'F06.30%', 'F06.31%',
                    'F06.32%', 'F06.33%', 'F06.81%', 'F06.91%', 'F20%', 'F21%',
                    'F22%', 'F23%', 'F24%', 'F25%', 'F28%', 'F29%', 'F39%',
                    'F30.24%', 'F31.24%', 'F31.54%', 'F32.34%', 'F33.34%',
                    'F30.23%', 'F30.24%', 'F30.25%', 'F30.26%', 'F30.27%',
                    'F30.28%', 'F31.23%', 'F31.24%', 'F31.25%', 'F31.26%',
                    'F31.27%', 'F31.28%', 'F31.53%', 'F31.54%', 'F31.55%',
                    'F31.56%', 'F31.57%', 'F31.58%', 'F32.33%', 'F32.34%',
                    'F32.35%', 'F32.36%', 'F32.37%', 'F32.38%', 'F33.33%',
                    'F33.34%', 'F33.35%', 'F33.36%', 'F33.37%', 'F33.38%',
                    'F80.31%', 'F84.0%', 'F84.1%', 'F84.2%', 'F84.3%',
                    'F84.4%', 'F99.1%'
                ], '', ''
            ],
            [
                u'  в том числе:\nорганические психозы и (или) слабоумие',
                u'F00-F05, F06(часть), F09', u'3',
                [
                    'F00%', 'F01%', 'F02%', 'F03%', 'F04%', 'F05%', 'F09%',
                    'F06.0%', 'F06.1%', 'F06.2%', 'F06.30%', 'F06.31%',
                    'F06.32%', 'F06.33%', 'F06.81%', 'F06.91%'
                ], '', ''
            ],
            [
                u'    из них: сосудистая деменция', u'F01', u'4', ['F01%'], '',
                ''
            ],
            [
                u'    другие формы старческого слабоумия',
                u'F00, F02.0, F02.1-.3, F03', u'5',
                [
                    'F00%', 'F01%', 'F02%', 'F03%', 'F02.0%', 'F02.1%',
                    'F02.2%', 'F02.3%'
                ], '', ''
            ],
            [
                u'    психозы и (или) слабоумие вследствие эпилепсии',
                u'F02.8x2, F04.2, F05.x2, F06(часть)', u'6',
                [
                    'F02.802%', 'F02.812%', 'F02.822%', 'F02.832%', 'F02.842%',
                    'F04.2%', 'F05.02%', 'F05.12%', 'F05.82%', 'F05.92%',
                    'F06.02%', 'F06.12%', 'F06.22%', 'F06.302%', 'F06.312%',
                    'F06.322%', 'F06.332%', 'F06.812%', 'F06.912%'
                ], '', ''
            ], [u'  шизофрения', u'F20', u'7', ['F20%'], '', ''],
            [u'  шизотипические расстройства', u'F21', u'8', ['F21%'], '', ''],
            [
                u'  шизоаффективные психозы, аффективные психозы с неконгруэнтным аффекту бредом',
                u'F25, F3x.x4', u'9',
                [
                    'F25%', 'F30.24%', 'F31.24%', 'F31.54%', 'F32.34%',
                    'F33.34%'
                ], '', ''
            ],
            [
                u'  острые и преходящие неорганические психозы', u'F23, F24',
                u'10', ['F23%', 'F24%'], '', ''
            ],
            [
                u'  хронические неорганические психозы, детские психозы, неуточнённые психотические расстройства',
                u'F22, F28, F29, F80.31, F84.0-.4, F99.1', u'11',
                [
                    'F22%', 'F28%', 'F29%', 'F80.31%', 'F84.0%', 'F84.1%',
                    'F84.2%', 'F84.3%', 'F84.4%', 'F99.1%'
                ], '', ''
            ],
            [
                u'    из них: детский аутизм, атипичный аутизм', u'F84.0-1',
                u'12', ['F84.0%', 'F84.1%'], '', ''
            ],
            [
                u'  аффективные психозы', u'F30-F39(часть)', u'13',
                [
                    'F30.23%', 'F30.24%', 'F30.25%', 'F30.26%', 'F30.27%',
                    'F30.28%', 'F31.23%', 'F31.24%', 'F31.25%', 'F31.26%',
                    'F31.27%', 'F31.28%', 'F31.53%', 'F31.54%', 'F31.55%',
                    'F31.56%', 'F31.57%', 'F31.58%', 'F32.33%', 'F32.34%',
                    'F32.35%', 'F32.36%', 'F32.37%', 'F32.38%', 'F33.33%',
                    'F33.34%', 'F33.35%', 'F33.36%', 'F33.37%', 'F33.38%'
                ], '', ''
            ],
            [
                u'    из них: биполярные расстройства',
                u'F31.23, F31.28, F31.53, F31.58', u'14',
                ['F31.23%', 'F31.28%', 'F31.53%', 'F31.58%'], '', ''
            ],
            [
                u'Психические расстройства непсихотического характера',
                u'F06(часть), F07, F30-F38, F40-F48, F50-F69, F80.0-.2, F80.32-F83, F84.5-F89, F90-F98, F99.2-.9',
                u'15',
                [
                    'F06.4%', 'F06.5%', 'F06.6%', 'F06.7%', 'F06.34%',
                    'F06.35%', 'F06.36%', 'F06.37%', 'F06.82%', 'F06.92%',
                    'F07%', 'F30%', 'F31%', 'F32%', 'F33%', 'F34%', 'F35%',
                    'F36%', 'F37%', 'F38%', 'F40%', 'F41%', 'F42%', 'F43%',
                    'F44%', 'F45%', 'F46%', 'F47%', 'F48%', 'F50%', 'F51%',
                    'F52%', 'F53%', 'F54%', 'F55%', 'F56%', 'F57%', 'F58%',
                    'F59%', 'F60%', 'F61%', 'F62%', 'F63%', 'F64%', 'F65%',
                    'F66%', 'F67%', 'F68%', 'F69%', 'F81%', 'F82%', 'F83%',
                    'F85%', 'F86%', 'F87%', 'F88%', 'F89%', 'F90%', 'F91%',
                    'F92%', 'F93%', 'F94%', 'F95%', 'F96%', 'F97%', 'F98%',
                    'F80.0%', 'F80.1%', 'F80.2%', 'F80.32%', 'F80.33%',
                    'F80.34%', 'F80.35%', 'F80.36%', 'F80.37%', 'F80.38%',
                    'F80.39%', 'F80.4%', 'F80.5%', 'F80.6%', 'F80.7%',
                    'F80.8%', 'F80.9%', 'F84.5%', 'F84.6%', 'F84.7%', 'F84.8%',
                    'F84.9%', 'F99.2%', 'F99.3%', 'F99.4%', 'F99.5%', 'F99.6%',
                    'F99.7%', 'F99.8%', 'F99.9%'
                ], '', ''
            ],
            [
                u'  в том числе:\nорганические непсихотические расстройства',
                u'F06(часть), F07', u'16',
                [
                    'F06.4%', 'F06.5%', 'F06.6%', 'F06.7%', 'F06.34%',
                    'F06.35%', 'F06.36%', 'F06.37%', 'F06.82%', 'F06.92%',
                    'F07%'
                ], '', ''
            ],
            [
                u'    из них: обусловленные эпилепсией', u'F06(часть), F07.x2',
                u'17',
                [
                    'F06.42%', 'F06.52%', 'F06.62%', 'F06.72%', 'F06.342%',
                    'F06.352%', 'F06.362%', 'F06.372%', 'F06.822%', 'F06.922%',
                    'F06.992%', 'F07.02%', 'F07.82%', 'F07.92%'
                ], '', ''
            ],
            [
                u'  аффективные непсихотические расстройства', u'F30-F38',
                u'18',
                [
                    'F30.0%', 'F30.1%', 'F31.0%', 'F31.1%', 'F30.8%',
                    'F30.90%', 'F30.91%', 'F30.92%', 'F30.93%', 'F30.94%',
                    'F31.3%', 'F31.4%', 'F31.6%', 'F31.7%', 'F31.8%', 'F31.9%',
                    'F32.0%', 'F32.1%', 'F32.2%', 'F32.8%', 'F32.9%', 'F33.0%',
                    'F33.1%', 'F33.2%', 'F33.4%', 'F33.5%', 'F33.6%', 'F33.7%',
                    'F33.8%', 'F33.9%', 'F35%', 'F36%', 'F37%', 'F38.0%',
                    'F38.1%', 'F38.2%', 'F38.3%', 'F38.4%', 'F38.5%', 'F38.6%',
                    'F38.7%', 'F38.8%'
                ], '', ''
            ],
            [
                u'    из них: биполярные расстройства',
                u'F31.0, F31.1, F31.3, F31.4, F31.6-F31.9', u'19',
                [
                    'F31.0%', 'F31.1%', 'F31.3%', 'F31.4%', 'F31.6%', 'F31.7%',
                    'F31.8%', 'F31.9%'
                ], '', ''
            ],
            [
                u'  невротические, связанные со стрессом и соматоформные расстройства',
                u'F40-F48', u'20',
                [
                    'F40%', 'F41%', 'F42%', 'F43%', 'F44%', 'F45%', 'F46%',
                    'F47%', 'F48%'
                ], '', ''
            ],
            [
                u'  другие непсихотические расстройства, поведенческие расстройства детского и подросткового возраста, неуточнённые непсихотические расстройства',
                u'F50-F59, F80.0-.2, F80.32-F83, F84.5-F89, F90-F98, F99.2-.9',
                u'21',
                [
                    'F50%', 'F51%', 'F52%', 'F53%', 'F54%', 'F55%', 'F56%',
                    'F57%', 'F58%', 'F59%', 'F60%', 'F61%', 'F62%', 'F63%',
                    'F64%', 'F65%', 'F66%', 'F67%', 'F68%', 'F69%', 'F81%',
                    'F82%', 'F83%', 'F85%', 'F86%', 'F87%', 'F88%', 'F89%',
                    'F90%', 'F91%', 'F92%', 'F93%', 'F94%', 'F95%', 'F96%',
                    'F97%', 'F98%', 'F80.0%', 'F80.1%', 'F80.2%', 'F80.32%',
                    'F80.33%', 'F80.34%', 'F80.35%', 'F80.36%', 'F80.37%',
                    'F80.38%', 'F80.39%', 'F80.4%', 'F80.5%', 'F80.6%',
                    'F80.7%', 'F80.8%', 'F80.9%', 'F84.5%', 'F84.6%', 'F84.7%',
                    'F84.8%', 'F84.9%', 'F99.2%', 'F99.3%', 'F99.4%', 'F99.5%',
                    'F99.6%', 'F99.7%', 'F99.8%', 'F99.9%'
                ], '', ''
            ],
            [
                u'    из них: синдром Аспергера', u'F84.5', u'22', ['F84.5%'],
                '', ''
            ],
            [
                u'  расстройства зрелой личности и поведения у взрослых',
                u'F60-F69', u'23',
                [
                    'F60%', 'F61%', 'F62%', 'F63%', 'F64%', 'F65%', 'F66%',
                    'F67%', 'F68%', 'F69%'
                ], '', ''
            ],
            [
                u'Умственная отсталость (всего)', u'F70-F79', u'24',
                [
                    'F70%', 'F71%', 'F72%', 'F73%', 'F74%', 'F75%', 'F76%',
                    'F77%', 'F78%', 'F79%'
                ], '', ''
            ],
            [
                u'  из неё: лёгкая умственная отсталость', u'F70', u'25',
                ['F70%'], '', ''
            ]
        ]
        # [u'Психические расстройства, классифицированные в других рубриках МКБ-10', u'G10-G40(часть)', u'24',
        #   ['G10%', 'G20%', 'G30%', 'G31%', 'G35%', 'G40%'],
        #   u'''LEFT JOIN Diagnosis AS diagAccompanying ON diagAccompanying.client_id = Client.id
        #                                              AND diagAccompanying.deleted = 0
        #                                              AND diagAccompanying.MKB LIKE 'F02.0%' AND diagAccompanying.MKB LIKE 'F02.2%' AND diagAccompanying.MKB LIKE 'F02.3%'
        #                                              AND diagAccompanying.MKB LIKE 'F02.8_7%'
        #                                              AND diagAccompanying.MKB LIKE 'F00.0%' AND diagAccompanying.MKB LIKE 'F00.1%' AND diagAccompanying.MKB LIKE 'F00.2%' AND diagAccompanying.MKB LIKE 'F00.9%'
        #                                              AND diagAccompanying.MKB LIKE 'F02.802%' AND diagAccompanying.MKB LIKE 'F02.812%' AND diagAccompanying.MKB LIKE 'F02.822%' AND diagAccompanying.MKB LIKE 'F02.832%' AND diagAccompanying.MKB LIKE 'F02.842%'
        #   LEFT JOIN rbDiagnosisType AS diagAccompanyingType ON diagAccompanyingType.id = diagAccompanying.diagnosisType_id
        #   LEFT JOIN Diagnostic AS dignosticAccompanying ON dignosticAccompanying.diagnosis_id = diagAccompanying.id AND dignosticAccompanying.deleted = 0 ''',
        #   u'''AND diagAccompanyingType.code = 9
        #   AND dignosticAccompanying.endDate IS NULL
        #   AND ((Diagnosis.MKB LIKE 'G10%' AND diagAccompanying.MKB LIKE 'F02.2%')
        #   OR (Diagnosis.MKB LIKE 'G20%' AND diagAccompanying.MKB LIKE 'F02.3%')
        #   OR (Diagnosis.MKB LIKE 'G31%' AND diagAccompanying.MKB LIKE 'F02.0%')
        #   OR (Diagnosis.MKB LIKE 'G35%' AND diagAccompanying.MKB LIKE 'F02.8_7%')
        #   OR (Diagnosis.MKB LIKE 'G30%' AND diagAccompanying.MKB LIKE 'F00.0%' AND diagAccompanying.MKB LIKE 'F00.1%' AND diagAccompanying.MKB LIKE 'F00.2%' AND diagAccompanying.MKB LIKE 'F00.9%')
        #   OR (Diagnosis.MKB LIKE 'G40%' AND diagAccompanying.MKB LIKE 'F02.802%' AND diagAccompanying.MKB LIKE 'F02.812%' AND diagAccompanying.MKB LIKE 'F02.822%' AND diagAccompanying.MKB LIKE 'F02.832%' AND diagAccompanying.MKB LIKE 'F02.842%')) ''']]

        compilance = forceBool(params.get('chkCompilance'))
        if not compilance:
            rowNameSet[23][4] = ''
            rowNameSet[23][5] = ''

        tabTempList = [
            [
                u'Зарегистрировано больных в течение года',
                u'в том числе в возрасте (из гр.4 т.2000)',
                u'Из общего числа больных (гр.4 т.2000) наблюдаются и получают консультативно-лечебную помощь по состоянию на конец года',
                '', ''
            ],

            # [u'Из общего числа больных (гр.4 т.2000) - сельских жителей',
            # u'в том числе в возрасте (из гр.14 т.2000)',
            # u'Из общего числа больных - сельских жителей (гр.14 т.2000) наблюдаются и получают консультативно-лечебную помощь по состоянию на конец года',
            # '',
            # ''],
            [
                u'Из общего числа больных (гр.4 т.3000) - с впервые в жизни установленным диагнозом',
                u'в том числе в возрасте (из гр.4 т.3000)',
                u'Из общего числа больных - с впервые в жизни установленным диагнозом (гр.4 т.3000) наблюдаются и получают консультативно-лечебную помощь по состоянию на конец года',
                '', u'''AND Diagnosis.id = (SELECT MIN(diagTemp2.id)
                                  FROM Diagnosis AS diagTemp2
                                  WHERE diagTemp2.client_id = Client.id AND diagTemp2.MKB = Diagnosis.MKB AND diagTemp2.deleted = 0)'''
            ]
        ]

        # [u'Из общего числа больных (гр.4 т.3000) - сельских жителей',
        # u'в том числе в возрасте (из гр.14 т.3000)',
        # u'Из общего числа больных - сельских жителей, с впервые в жизни установленным диагнозом (гр.14 т.3000) наблюдаются и получают консультативно-лечебную помощь по состоянию на конец года',
        # '',
        # u'''AND Diagnosis.id = (SELECT MIN(diagTemp2.id)
        #             FROM Diagnosis AS diagTemp2
        #             WHERE diagTemp2.client_id = Client.id AND diagTemp2.MKB = Diagnosis.MKB AND diagTemp2.deleted = 0)''']]

        bf = QtGui.QTextCharFormat()
        bf.setFontWeight(QtGui.QFont.Bold)

        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)

        cursor.setBlockFormat(CReportBase.AlignLeft)
        cursor.setCharFormat(CReportBase.ReportTitle)
        cursor.insertText(self.title())
        cursor.insertBlock()
        self.dumpParams(cursor, params)

        def createTableHeader(cursor, header):
            tableColumns = [
                ('10%', [u'Наименование', u'', u'',
                         u'1'], CReportBase.AlignCenter),
                ('7%', [
                    u'Код по МКБ-10 (класс V, адаптированный для использования в РФ)',
                    u'', u'', u'2'
                ], CReportBase.AlignCenter),
                ('3%', [u'№ стр.', u'', u'', u'3'], CReportBase.AlignCenter),
                ('8%', [header[0], u'всего', u'',
                        u'4'], CReportBase.AlignCenter),
                ('8%', [u'', u'из них - женщин', u'',
                        u'5'], CReportBase.AlignCenter),
                ('8%', [u'', header[1], u'0 - 14 лет',
                        u'6'], CReportBase.AlignCenter),
                ('8%', [u'', u'', u'15 - 17 лет',
                        u'7'], CReportBase.AlignCenter),
                ('8%', [u'', u'', u'18 - 19 лет',
                        u'8'], CReportBase.AlignCenter),
                ('8%', [u'', u'', u'20 - 39 лет',
                        u'9'], CReportBase.AlignCenter),
                ('8%', [u'', u'', u'40 - 59 лет',
                        u'10'], CReportBase.AlignCenter),
                ('8%', [u'', u'', u'60 лет и старше',
                        u'11'], CReportBase.AlignCenter),
                ('8%', [header[2], u'', u'диспансерные больные',
                        u'12'], CReportBase.AlignCenter),
                ('8%', [u'', u'', u'консультативные больные',
                        u'13'], CReportBase.AlignCenter)
            ]

            table = createTable(cursor, tableColumns)

            table.mergeCells(0, 0, 3, 1)
            table.mergeCells(0, 1, 3, 1)
            table.mergeCells(0, 2, 3, 1)
            table.mergeCells(0, 3, 1, 8)
            table.mergeCells(1, 3, 2, 1)
            table.mergeCells(1, 4, 2, 1)
            table.mergeCells(1, 5, 1, 6)
            table.mergeCells(0, 11, 2, 2)
            return table

        flag = 0
        for tabTemp in tabTempList:
            bf = QtGui.QTextCharFormat()
            bf.setFontWeight(QtGui.QFont.Bold)
            pf = QtGui.QTextCharFormat()

            cursor.insertBlock()
            cursor.setCharFormat(bf)
            if flag < 1:
                cursor.insertText(u'(2000)')
            else:
                cursor.insertText(u'(3000)')
            cursor.setCharFormat(pf)

            table = createTableHeader(cursor, tabTemp)

            columnQuery = [14, 17, 19, 39, 59, 60]

            for row in rowNameSet:
                i = table.addRow()
                table.setText(i, 0, row[0])
                table.setText(i, 1, row[1])
                table.setText(i, 2, row[2])
                if flag == 0 or flag == 1:
                    join = tabTemp[3]
                    if row[4] != '':
                        join += row[4]
                    where = tabTemp[4]
                    if row[5] != '':
                        where += row[5]
                    query = selectData(params, row[3], join, where)
                    self.setQueryText(forceString(query.lastQuery()))
                    if query.first():
                        record = query.record()
                        table.setText(i, 3, forceInt(record.value('countAll')))
                        table.setText(i, 4,
                                      forceInt(record.value('countAllFemale')))
                        table.setText(i, 11,
                                      forceInt(record.value('countAllD')))
                        table.setText(i, 12,
                                      forceInt(record.value('countAllK')))
                        j = 5
                        for countName in columnQuery:
                            table.setText(
                                i, j,
                                forceInt(record.value('count%s' % countName)))
                            j += 1
                else:
                    j = 3
                    while j < 13:
                        table.setText(i, j, u'0')
                        j += 1

            cursor.movePosition(QtGui.QTextCursor.End)
            cursor.insertBlock()
            cursor.insertBlock()
            if flag == 0:
                cursor.insertBlock()

                row = [
                    u'Психические расстройства, классифицированные в других рубриках МКБ-10',
                    u'G10-G40(часть)', u'24',
                    ['G10%', 'G20%', 'G30%', 'G31%', 'G35%', 'G40%'],
                    u'''LEFT JOIN Diagnosis AS diagAccompanying ON diagAccompanying.client_id = Client.id
                                                                  AND diagAccompanying.deleted = 0
                                                                  AND diagAccompanying.MKB LIKE 'F02.0%' AND diagAccompanying.MKB LIKE 'F02.2%' AND diagAccompanying.MKB LIKE 'F02.3%'
                                                                  AND diagAccompanying.MKB LIKE 'F02.8_7%'
                                                                  AND diagAccompanying.MKB LIKE 'F00.0%' AND diagAccompanying.MKB LIKE 'F00.1%' AND diagAccompanying.MKB LIKE 'F00.2%' AND diagAccompanying.MKB LIKE 'F00.9%'
                                                                  AND diagAccompanying.MKB LIKE 'F02.802%' AND diagAccompanying.MKB LIKE 'F02.812%' AND diagAccompanying.MKB LIKE 'F02.822%' AND diagAccompanying.MKB LIKE 'F02.832%' AND diagAccompanying.MKB LIKE 'F02.842%'
                       LEFT JOIN rbDiagnosisType AS diagAccompanyingType ON diagAccompanyingType.id = diagAccompanying.diagnosisType_id
                       LEFT JOIN Diagnostic AS dignosticAccompanying ON dignosticAccompanying.diagnosis_id = diagAccompanying.id AND dignosticAccompanying.deleted = 0 ''',
                    u'''AND diagAccompanyingType.code = 9
                       AND dignosticAccompanying.endDate IS NULL
                       AND ((Diagnosis.MKB LIKE 'G10%' AND diagAccompanying.MKB LIKE 'F02.2%')
                       OR (Diagnosis.MKB LIKE 'G20%' AND diagAccompanying.MKB LIKE 'F02.3%')
                       OR (Diagnosis.MKB LIKE 'G31%' AND diagAccompanying.MKB LIKE 'F02.0%')
                       OR (Diagnosis.MKB LIKE 'G35%' AND diagAccompanying.MKB LIKE 'F02.8_7%')
                       OR (Diagnosis.MKB LIKE 'G30%' AND diagAccompanying.MKB LIKE 'F00.0%' AND diagAccompanying.MKB LIKE 'F00.1%' AND diagAccompanying.MKB LIKE 'F00.2%' AND diagAccompanying.MKB LIKE 'F00.9%')
                       OR (Diagnosis.MKB LIKE 'G40%' AND diagAccompanying.MKB LIKE 'F02.802%' AND diagAccompanying.MKB LIKE 'F02.812%' AND diagAccompanying.MKB LIKE 'F02.822%' AND diagAccompanying.MKB LIKE 'F02.832%' AND diagAccompanying.MKB LIKE 'F02.842%')) '''
                ]

                join = tabTemp[3]
                if row[4] != '':
                    join += row[4]
                where = tabTemp[4]
                if row[5] != '':
                    where += row[5]
                query = selectData(params, row[3], join, where)
                if query.first():
                    record = query.record()
                    count = forceString(record.value('countAll'))
                else:
                    count = '0'

                cursor.insertText(
                    u'(2100) Число психических расстройств, классифицированных в других рубриках МКБ-10, выявленных в отчетном году '
                    + count)
                cursor.insertBlock()
                cursor.insertBlock()

            flag += 1

        return doc
Esempio n. 11
0
def selectData(params, numberDiagnosis, join, where):
    db = QtGui.qApp.db
    begDate = forceDate(params.get('begDate'))
    endDate = forceDate(params.get('endDate'))
    isRegistry = forceBool(params.get('isRegistry'))
    nextYear = forceString(forceInt(endDate.toString('yyyy')) + 1) + '-01-01'
    columnQuery = [0, 14, 15, 17, 18, 19, 20, 39, 40, 59, 60]
    select = u'''COUNT(DISTINCT Client.id) AS countAll,
                COUNT(DISTINCT IF(Client.sex = 2, Client.id, NULL)) AS countAllFemale,
                COUNT(DISTINCT IF(rbClientMonitoringKind.code LIKE 'К', Client.id, NULL)) AS countAllK,
                COUNT(DISTINCT IF(rbClientMonitoringKind.code LIKE 'Д', Client.id, NULL)) AS countAllD,'''
    j = 0
    while j < len(columnQuery) - 1:
        select += u'''\nCOUNT(DISTINCT IF(TIMESTAMPDIFF(YEAR, Client.birthDate, '%s') >= %s
            AND TIMESTAMPDIFF(YEAR, Client.birthDate, '%s') <= %s, Client.id, NULL)) AS count%s, ''' % (
            nextYear, columnQuery[j], nextYear, columnQuery[j + 1],
            columnQuery[j + 1])
        j += 2
    select += u'''\nCOUNT(DISTINCT IF(TIMESTAMPDIFF(YEAR, Client.birthDate, '%s') >= %s, Client.id , NULL)) AS count%s ''' % (
        nextYear, columnQuery[j], columnQuery[j])
    joinWhereDiagnosis = ''
    if len(numberDiagnosis) > 0:
        joinWhereDiagnosis = u'''AND ('''
        for mkb in numberDiagnosis:
            joinWhereDiagnosis += u'''Diagnosis.MKB LIKE '%s' OR ''' % mkb
        joinWhereDiagnosis += u'''False)'''
    if isRegistry:
        joinWhereEvent = ''
    else:
        joinWhereEvent = u'''LEFT JOIN Event ON Event.client_id = Client.id AND Event.deleted = 0
                             AND ((DATE(Event.setDate) >= DATE('%s') AND DATE(Event.setDate) <= DATE('%s'))
                             OR (DATE(Event.execDate) >= DATE('%s') AND DATE(Event.execDate) <= DATE('%s'))
                             OR (DATE(Event.setDate) <= DATE('%s') AND DATE(Event.execDate) >= DATE('%s')))''' % (
            begDate.toString('yyyy-MM-dd'), endDate.toString('yyyy-MM-dd'),
            begDate.toString('yyyy-MM-dd'), endDate.toString('yyyy-MM-dd'),
            begDate.toString('yyyy-MM-dd'), endDate.toString('yyyy-MM-dd'))

    # joinWhereClientAttach = u'''AND DATE(clatMain.begDate) >= DATE('%s') AND DATE(clatMain.begDate) <= DATE('%s')''' % (begDate.toString('yyyy-MM-dd'), endDate.toString('yyyy-MM-dd'))

    joinWhereClientMonitoring = u'''AND (ClientMonitoring.endDate IS NULL OR DATE(ClientMonitoring.endDate) >= DATE('2200-01-01'))'''

    # if isRegistry:
    #     where += u'''AND (clatMain.id IS NOT NULL
    #                OR (rbClientMonitoringKind.code LIKE 'К' AND clatMain.id IS NULL AND (Diagnostic.endDate IS NULL OR DATE(Diagnostic.endDate) >= DATE('2200-01-01')))
    #                OR (rbClientMonitoringKind.code LIKE 'Д' AND clatMain.id IS NULL AND (Diagnostic.endDate IS NULL OR DATE(Diagnostic.endDate) >= DATE('2200-01-01')))) '''
    # else:
    #     where += u'''AND ((clatMain.id IS NOT NULL AND Event.id IS NOT NULL)
    #                OR (rbClientMonitoringKind.code LIKE 'К' AND clatMain.id IS NULL AND (Diagnostic.endDate IS NULL OR DATE(Diagnostic.endDate) >= DATE('2200-01-01')))
    #                OR (rbClientMonitoringKind.code LIKE 'Д' AND clatMain.id IS NULL AND Event.id IS NOT NULL AND (Diagnostic.endDate IS NULL OR DATE(Diagnostic.endDate) >= DATE('2200-01-01')))) '''

    if isRegistry:
        where += u'''AND ((rbClientMonitoringKind.code LIKE 'К' AND (Diagnostic.endDate IS NULL OR DATE(Diagnostic.endDate) >= DATE('2200-01-01')))
                   OR (rbClientMonitoringKind.code LIKE 'Д' AND (Diagnostic.endDate IS NULL OR DATE(Diagnostic.endDate) >= DATE('2200-01-01')))) '''
    else:
        where += u'''AND (Event.id IS NOT NULL
                   OR (rbClientMonitoringKind.code LIKE 'К' AND (Diagnostic.endDate IS NULL OR DATE(Diagnostic.endDate) >= DATE('2200-01-01')))
                   OR (rbClientMonitoringKind.code LIKE 'Д' AND Event.id IS NOT NULL AND (Diagnostic.endDate IS NULL OR DATE(Diagnostic.endDate) >= DATE('2200-01-01')))) '''
    stmt = u'''
        SELECT %s
        FROM Client
        INNER JOIN Diagnosis ON Diagnosis.client_id = Client.id
                                AND Diagnosis.deleted = 0
                                AND Diagnosis.id = (SELECT MAX(diagTemp.id)
                                                    FROM Diagnosis AS diagTemp
                                                    INNER JOIN rbDiagnosisType AS diagnosisTypeTemp ON diagnosisTypeTemp.id = diagTemp.diagnosisType_id
                                                                                                       AND (diagnosisTypeTemp.code = 2 OR diagnosisTypeTemp.code = 1)
                                                    WHERE diagTemp.client_id = Client.id AND diagTemp.deleted = 0)
                                %s
        INNER JOIN Diagnostic ON Diagnostic.diagnosis_id = Diagnosis.id AND Diagnostic.deleted = 0
        %s
        LEFT JOIN ClientMonitoring ON ClientMonitoring.client_id = Client.id %s
        LEFT JOIN rbClientMonitoringKind ON rbClientMonitoringKind.id = ClientMonitoring.kind_id
        %s
        WHERE Client.deleted = 0
              %s
    ''' % (select, joinWhereDiagnosis, joinWhereEvent,
           joinWhereClientMonitoring, join, where)  #joinWhereClientAttach,

    # LEFT JOIN ClientAttach AS clatMain ON clatMain.id = (SELECT MAX(clatTemp.id)
    #                                                      FROM ClientAttach AS clatTemp
    #                                                      WHERE clatTemp.deleted = 0
    #                                                            AND clatTemp.client_id = Client.id
    #                                                            AND clatTemp.id = (SELECT MAX(clatTempLow.id)
    #                                                                               FROM ClientAttach AS clatTempLow
    #                                                                               INNER JOIN rbAttachType ON rbAttachType.id = clatTempLow.attachType_id AND rbAttachType.outcome = 1
    #                                                                               WHERE clatTempLow.deleted = 0 AND clatTempLow.client_id = Client.id))
    #                                       %s

    return db.query(stmt)
Esempio n. 12
0
    def build(self, params):
        def addOnes(rows, column):
            for row in rows:
                reportLine = reportData[row]
                reportLine[column] += 1

#        global Rows

        begDate = params.get('begDate', QtCore.QDate())
        endDate = params.get('endDate', QtCore.QDate())
        eventTypeId = params.get('eventTypeId', None)
        onlyPermanentAttach = params.get('onlyPermanentAttach', False)
        onlyPayedEvents = params.get('onlyPayedEvents', False)
        begPayDate = params.get('begPayDate', QtCore.QDate())
        endPayDate = params.get('endPayDate', QtCore.QDate())
        workType = params.get('workType', 0)
        ownership = params.get('ownership', 0)

        db = QtGui.qApp.db

        self.Rows = [] + Rows
        if self.mode == '09':
            self.Rows.insert(18,
                             (u'ишемическая болезнь мозга', u'10.3', u'I67.8'))
            self.Rows.append((u'прочие', u'21.0', u'D00-D49'))

        mapRows = createMapCodeToRowIdx([row[2] for row in self.Rows])
        reportRowSize = 11
        reportData = [[0] * reportRowSize for row in self.Rows]
        query = selectDiagnostics(begDate, endDate, eventTypeId,
                                  onlyPermanentAttach, onlyPayedEvents,
                                  begPayDate, endPayDate)
        prevClientId = None
        prevMKB = None
        clientRowsP8 = set([])
        clientRowsP9 = set([])
        clientRowsP10 = set([])
        clientRowsP11 = set([])
        clientRowsP13 = set([])
        clientRowsP14 = set([])

        while query.next():
            record = query.record()

            if ownership > 0 and ownership != forceInt(
                    record.value('ownership')):
                continue
            if workType > 0:
                okved = forceString(record.value('OKVED'))
                if workType not in OKVEDList.dispatch(okved):
                    continue
            clientId = forceInt(record.value('client_id'))
            isPrimary = forceInt(record.value('isPrimary')) == 1
            mkb = normalizeMKB(forceString(record.value('mkb')))
            p4 = forceBool(record.value('P4'))
            p5 = forceBool(record.value('P5'))
            p6 = forceBool(record.value('P6'))
            p8 = forceBool(record.value('P8'))
            p9 = forceBool(record.value('P9'))
            p10 = forceBool(record.value('P10'))
            p11 = forceBool(record.value('P11'))

            diagRows = mapRows.get(mkb, [])
            if prevClientId != clientId or prevMKB != mkb:
                if not isPrimary:
                    addOnes(diagRows, 8)
                addOnes(diagRows, 0)
                if p4:
                    addOnes(diagRows, 1)
                if p5:
                    addOnes(diagRows, 2)
                if p6:
                    addOnes(diagRows, 3)
                prevMKB = mkb
            if prevClientId != clientId:
                addOnes(clientRowsP8, 4)
                addOnes(clientRowsP9, 5)
                addOnes(clientRowsP10, 6)
                addOnes(clientRowsP11, 7)
                addOnes(clientRowsP13, 9)
                addOnes(clientRowsP14, 10)
                clientRowsP8 = set([])
                clientRowsP9 = set([])
                clientRowsP10 = set([])
                clientRowsP11 = set([])
                clientRowsP13 = set([])
                clientRowsP14 = set([])
                prevClientId = clientId
            if p8:
                clientRowsP8.update(diagRows)
            if p9:
                clientRowsP9.update(diagRows)
            if p10 and p6:
                clientRowsP10.update(diagRows)
            if p11 and p6:
                clientRowsP11.update(diagRows)
            if p10:
                clientRowsP13.update(diagRows)
            if p11:
                clientRowsP14.update(diagRows)
        addOnes(clientRowsP8, 4)
        addOnes(clientRowsP9, 5)
        addOnes(clientRowsP10, 6)
        addOnes(clientRowsP11, 7)
        addOnes(clientRowsP13, 9)
        addOnes(clientRowsP14, 10)

        # now text
        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)

        cursor.setCharFormat(CReportBase.ReportTitle)
        cursor.insertText(self.title())
        cursor.insertBlock()
        self.dumpParams(cursor, params)

        tableColumns = [
            ('18%', [
                u'Наименование заболевания (по классам и отдельным нозологиям)',
                u'', u'1'
            ], CReportBase.AlignLeft),
            ('6%', [u'№ строки', u'', u'2'], CReportBase.AlignCenter),
            ('10%', [u'Код по МКБ-10', u'', u'3'], CReportBase.AlignCenter),
            ('6%', [u'Заболевания', u'всего', u'4'], CReportBase.AlignRight),
            ('6%', [u'', u'ранее изве-\nстное хрони-\nческое',
                    u'5'], CReportBase.AlignRight),
            ('6%', [u'', u'выявле-\nнное во время доп. дисп.',
                    u'6'], CReportBase.AlignRight),
            ('6%', [u'', u'в том числе на поздней стадии (из гр.6)',
                    u'7'], CReportBase.AlignRight),
            ('6%', [
                u'Госпитализировано больных (из числа выявленных - графа 6)',
                u'в стационар (в том числе субъе-\nкта РФ)', u'8'
            ], CReportBase.AlignRight),
            ('6%', [u'', u'в фед. спец. мед. уч. (для оказания ВМП)',
                    u'9'], CReportBase.AlignRight),
            ('6%', [
                u'Из числа граждан, прошедших доп. дисп. сост. под дисп. набл. (из гр.6)',
                u'', u'10'
            ], CReportBase.AlignRight),
            ('6%', [
                u'Из числа граждан, прошедших доп. дисп. взято под дисп. набл. (из гр.6)',
                u'', u'11'
            ], CReportBase.AlignRight),
            ('6%', [
                u'Выявлено забо-\nлеваний в течение 6 месяцев после прохождения доп. дисп.',
                u'', u'12'
            ], CReportBase.AlignRight),
            ('6%', [
                u'Из числа граждан, прошедших доп. дисп. сост. под дисп. набл.',
                u'', u'13'
            ], CReportBase.AlignRight),
            ('6%', [
                u'Из числа граждан, прошедших доп. дисп. взято под дисп. набл.',
                u'', u'14'
            ], CReportBase.AlignRight),
        ]
        table = createTable(cursor, tableColumns)
        table.mergeCells(0, 0, 2, 1)
        table.mergeCells(0, 1, 2, 1)
        table.mergeCells(0, 2, 2, 1)
        table.mergeCells(0, 3, 1, 4)
        table.mergeCells(0, 7, 1, 2)
        table.mergeCells(0, 9, 2, 1)
        table.mergeCells(0, 10, 2, 1)
        table.mergeCells(0, 11, 2, 1)
        table.mergeCells(0, 12, 2, 1)
        table.mergeCells(0, 13, 2, 1)

        for iRow, row in enumerate(self.Rows):
            i = table.addRow()
            for j in xrange(3):
                table.setText(i, j, row[j])
            for j in xrange(reportRowSize):
                table.setText(i, 3 + j, reportData[iRow][j])
        return doc
Esempio n. 13
0
    def build(self, params):
        curDate = params.get('curDate', QtCore.QDate.currentDate())
        begDateTime = QtCore.QDateTime(curDate.addDays(-1), self.YesterdayBeginTime)
        endDateTime = QtCore.QDateTime(curDate, self.TodayBeginTime)

        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)
        cursor.setCharFormat(CReportBase.ReportTitle)
        cursor.insertText(self.title())
        cursor.movePosition(QtGui.QTextCursor.End)

        cursor.insertBlock()
        cursor.insertBlock()
        self.dumpParams(cursor, params)
        cursor.insertBlock()

        cursor.setCharFormat(QtGui.QTextCharFormat())
        headerTable, mainTable = self.createTable(params, cursor)

        receptionRVC_Id = 119 # Приемное отделение РСЦ
        RVC_Id = 34           # Региональный сосудистый центр
        RVCDescendants = getOrgStructureDescendants(RVC_Id)
        EVDT_Id = 92          # Отделение рентгенэндоваскулярной диагностики и лечения

        orgStructuresRVC = [
            # (id, наименование, номер строки в таблице)
            (27, u'ОАР для больных с ОНМК', 2),
            (28, u'ОАР для больных с ОИМ', 3),
            (36, u'1-е неврологическое отделение', 4),
            (39, u'Отделение сосудистой хирургии', 5),
            (37, u'2-е кардиологическое отделение', 6),
            (38, u'2-е нейрохирургическое отделение (сосудистое)', 7),
            (118, u'Кардиологическое отделение для больных с ОИМ (ОНК)', 8)
        ]
        TherapeuticOS3 = (106, u'3-е терапевтическое отделение', 10)

        orgStructureIdsRVC = [id for id, name, row in orgStructuresRVC]
        # orgStructureIdList = [org[0] for org in orgStructuresRVC + [TherapeuticOS3]]

        query = selectData(begDateTime, endDateTime)
        self.setQueryText(forceString(query.lastQuery()))

        hospitalizationInfo = {}
        reportRows = {}
        orgStructureEvents = {}
        orgStructureCode = {}

        while query.next():
            record = query.record()
            id = forceRef(record.value('osId'))
            code = forceString(record.value('osCode'))
            # totalBeds = forceInt(record.value('totalBeds'))
            permanentBeds = forceInt(record.value('permanentBeds'))
            # involuteBed = forceInt(record.value('involuteBed'))
            menBed = forceInt(record.value('menBed'))
            womenBed = forceInt(record.value('womenBed'))
            men = forceInt(record.value('men'))
            women = forceInt(record.value('women'))
            received = forceInt(record.value('received'))
            byHimself = forceInt(record.value('byHimself'))
            refused = forceInt(record.value('refused'))
            moving = forceInt(record.value('moving'))
            movingInto = forceInt(record.value('movingInto'))
            movingFrom = forceInt(record.value('movingFrom'))
            leaved = forceInt(record.value('leaved'))
            dead = forceInt(record.value('dead'))
            eventsDMS = forceString(record.value('eventsDMS'))
            eventsPMU = forceString(record.value('eventsPMU'))
            eventsDeath = forceString(record.value('eventsDeath'))

            orgStructureCode[id] = code

            orgStructureEvents.setdefault(id, {'DMS': [], 'PMU': [], 'Death': []})
            if eventsDMS:
                orgStructureEvents[id]['DMS'].extend(map(int, eventsDMS.split(',')))
            if eventsPMU:
                orgStructureEvents[id]['PMU'].extend(map(int, eventsPMU.split(',')))
            if eventsDeath:
                orgStructureEvents[id]['Death'].extend(map(int, eventsDeath.split(',')))

            hospitalizationInfo[id] = {
                'byHimself': byHimself,
                'refused': refused
            }

            usedBeds = moving + received + movingInto - movingFrom - leaved - dead
            freeBeds = permanentBeds - usedBeds
            freeMenBeds = menBed - men
            freeWomenBeds = womenBed - women

            reportRows[id] = [
                permanentBeds,
                moving,
                received,
                movingInto,
                movingFrom,
                leaved,
                dead,
                usedBeds,
                freeBeds if freeBeds > 0 else 0,
                freeMenBeds if freeMenBeds > 0 else 0,
                freeWomenBeds if freeWomenBeds > 0 else 0
            ]

        totalRVC = [sum(data) for data in zip(*[reportRows[os[0]] for os in orgStructuresRVC])]
        totalB36 = [sum(data) for data in zip(*reportRows.itervalues())]

        hospitalizationTotal = totalB36[2]
        hospitalizationRVC = totalRVC[2]
        hospitalizationT3 = reportRows[TherapeuticOS3[0]][2]
        hospitalizationOther = hospitalizationTotal - hospitalizationRVC - hospitalizationT3

        hospitalizationByHimself = sum(hospitalizationInfo[osId]['byHimself'] for osId in hospitalizationInfo.iterkeys())
        hospitalizationRefused = sum(hospitalizationInfo[osId]['refused'] for osId in hospitalizationInfo.iterkeys())

        operationTotal, operationUrgent, coronaryTotal, coronaryUrgent = getOperations(begDateTime, endDateTime, EVDT_Id)

        headerTable.setText(0, 0, u'Обратилось в приемное отделение РСЦ')
        headerTable.setText(0, 1, countEventsByOrgStructure(begDateTime, endDateTime, receptionRVC_Id))
        headerTable.setText(1, 0, u'Госпитализировано')
        headerTable.setText(1, 1, hospitalizationTotal)
        headerTable.setText(1, 2, u'в РСЦ - {hospRVC}'.format(hospRVC=hospitalizationRVC), fontBold=True)
        headerTable.setText(1, 3, u'в 3 т/о - {hospT3}'.format(hospT3=hospitalizationT3), fontBold=True)
        headerTable.setText(1, 4, u'др. отд. - {hospOther}'.format(hospOther=hospitalizationOther), fontBold=True)
        headerTable.setText(2, 0, u'Отказ от госпитализации')
        headerTable.setText(2, 1, hospitalizationRefused)
        headerTable.setText(3, 0, u'Обратилось "Самотеком"')
        headerTable.setText(3, 1, hospitalizationByHimself)
        headerTable.setText(4, 0, u'Выполнено коронарографий')
        headerTable.setText(4, 1, coronaryTotal)
        headerTable.setText(4, 2, u'плановых - {count}'.format(count=coronaryTotal - coronaryUrgent))
        headerTable.setText(4, 3, u'экстренных - {count}'.format(count=coronaryUrgent))
        headerTable.setText(5, 0, u'Другие операции в ОРДЛ')
        headerTable.setText(5, 1, operationTotal)
        headerTable.setText(5, 2, u'плановых - {count}'.format(count=operationTotal - operationUrgent))
        headerTable.setText(5, 3, u'экстренных - {count}'.format(count=operationUrgent))

        for osId, osName, tableRow in orgStructuresRVC + [TherapeuticOS3]:
            mainTable.setText(tableRow, 0, osName, fontBold=(osId==TherapeuticOS3[0]))
            for col, cnt in enumerate(reportRows[osId]):
                mainTable.setText(tableRow, col + 1, cnt)

        mainTable.setText(9, 0, u'Итого по РСЦ:', fontBold=True)
        for col, cnt in enumerate(totalRVC):
            mainTable.setText(9, col + 1, cnt)

        mainTable.setText(11, 0, u'Госпитализировано в другие отделения ГКБ №36')
        mainTable.setText(11, 3, hospitalizationOther)

        cursor.movePosition(QtGui.QTextCursor.End)
        cursor.insertBlock()
        cursor.insertBlock()

        # 3

        cursor.setCharFormat(CReportBase.ReportSubTitle)
        cursor.insertText(u'Пациенты госпитализированные по каналу ПМУ/ДМС')
        cursor.movePosition(QtGui.QTextCursor.End)
        cursor.insertBlock()

        DMS_PMU_columns = [
            ('50?', [u'Ф.И.О. пациента'], CReportBase.AlignLeft),
            ('5?', [u'Канал (ПМУ или ДМС)'], CReportBase.AlignLeft),
            ('20?', [u'Отделение'], CReportBase.AlignLeft),
            ('25?', [u'Страх. компания'], CReportBase.AlignLeft),
        ]
        DMS_PMU_table = createTable(cursor, DMS_PMU_columns)

        receivedEvents = []
        deathEvents = []
        financeMap = {}
        receivedEventsMap = {}
        deathEventsMap = {}

        receivedClients = []
        deathClients = []

        for orgStructureId, eventsMap in orgStructureEvents.iteritems():
            if orgStructureId in orgStructureIdsRVC:
                receivedEvents.extend(eventsMap['DMS'])
                receivedEvents.extend(eventsMap['PMU'])
                deathEvents.extend(eventsMap['Death'])
                for eventId in eventsMap['DMS']:
                    financeMap[eventId] = 'DMS'
                    receivedEventsMap[eventId] = orgStructureId
                for eventId in eventsMap['PMU']:
                    financeMap[eventId] = 'PMU'
                    receivedEventsMap[eventId] = orgStructureId
                for eventId in eventsMap['Death']:
                    deathEventsMap[eventId] = orgStructureId


        if receivedClients:
            queryReceived = selectReceivedClients(receivedEvents)
            self.addQueryText(forceString(queryReceived.lastQuery()))
            while queryReceived.next():
                record = queryReceived.record()
                orgStructure = forceRef(record.value('orgStructure'))
                lastName = forceString(record.value('lastName'))
                firstName = forceString(record.value('firstName'))
                patrName = forceString(record.value('patrName'))
                insurer = forceString(record.value('insurer'))
                channel = forceString(record.value('channel'))

                name = formatName(lastName, firstName, patrName)

                receivedClients.append((name, channel, orgStructure, insurer))

        receivedClients = sorted(receivedClients, cmp=lambda x,y: cmp(x[0], y[0]))
        for row in receivedClients:
            i = DMS_PMU_table.addRow()
            DMS_PMU_table.setText(i, 0, row[0])
            DMS_PMU_table.setText(i, 1, row[1])
            DMS_PMU_table.setText(i, 2, row[2])
            DMS_PMU_table.setText(i, 3, row[3])

        cursor.insertBlock()
        cursor.movePosition(QtGui.QTextCursor.End)
        cursor.insertBlock()
        cursor.insertBlock()

        # 4
        if deathEvents:
            queryDead = selectDeadClients(deathEvents)
            self.addQueryText(forceString(queryDead.lastQuery()))
            while queryDead.next():
                record = queryDead.record()
                orgStructure = forceString(record.value('orgStructure'))
                lastName = forceString(record.value('lastName'))
                firstName = forceString(record.value('firstName'))
                patrName = forceString(record.value('patrName'))
                age = forceInt(record.value('age'))
                externalId = forceString(record.value('externalId'))
                deathTime = forceDateTime(record.value('deathTime'))

                name = formatName(lastName, firstName, patrName)

                deathClients.append((name, age, externalId, orgStructure, deathTime))

        cursor.setCharFormat(CReportBase.ReportSubTitle)
        cursor.insertText(u'Умерло пациентов всего: {0}'.format(len(deathClients)))
        cursor.movePosition(QtGui.QTextCursor.End)
        cursor.insertBlock()

        deathClientsColumns = [
            ('50?', [u'Ф.И.О. пациента'], CReportBase.AlignLeft),
            ('5?', [u'Возраст'], CReportBase.AlignLeft),
            ('5?', [u'№ истории болезни'], CReportBase.AlignLeft),
            ('30?', [u'Отделение'], CReportBase.AlignLeft),
            ('10?', [u'Дата и время смерти'], CReportBase.AlignLeft),
        ]
        deathClientsTable = createTable(cursor, deathClientsColumns)

        deathClients = sorted(deathClients, cmp=lambda x,y: cmp(x[0], y[0]))
        for row in deathClients:
            i = deathClientsTable.addRow()
            deathClientsTable.setText(i, 0, row[0])
            deathClientsTable.setText(i, 1, row[1])
            deathClientsTable.setText(i, 2, row[2])
            deathClientsTable.setText(i, 3, row[3])
            deathClientsTable.setText(i, 4, row[4].toString('dd.MM.yyyy hh:mm'))

        return doc
Esempio n. 14
0
 def isEditable(self, action):
     return forceInt(action.getRecord().value('status')) < 2
Esempio n. 15
0
    def build(self, params):
        rows = [
            (u'Образование', u'01', u'М80'),
            (u'Здравоохранение', u'02', u'N85.1-N85.14'),
            (u'Предоставление социальных услуг', u'03', u'N85.3'),
            (u'Деятельность по организации отдыха, развлечений, культуры и спорта',
             u'04', u'О92'),
            (u'Научно-исследовательские учреждения', u'05', u'К73'),
            (u'ВСЕГО', u'06', u'X'),
        ]

        def dispatch(okved):
            result = [len(rows) - 1]
            if okved[:3] == u'M80':
                result.append(0)
            if okved[:5] >= u'N85.1' and okved[:6] <= u'N85.14':
                result.append(1)
            if okved[:5] == u'N85.3':
                result.append(2)
            if okved[:3] == u'O92':
                result.append(3)
            if okved[:3] == u'K73':
                result.append(4)
            return result

        begDate = getVal(params, 'begDate', QtCore.QDate())
        endDate = getVal(params, 'endDate', QtCore.QDate())
        eventTypeId = getVal(params, 'eventTypeId', None)
        onlyPermanentAttach = getVal(params, 'onlyPermanentAttach', False)
        onlyPayedEvents = getVal(params, 'onlyPayedEvents', False)
        begPayDate = getVal(params, 'begPayDate', QtCore.QDate())
        endPayDate = getVal(params, 'endPayDate', QtCore.QDate())

        reportRowSize = 12
        reportData = [[0] * reportRowSize for row in rows]
        query = selectData(begDate, endDate, eventTypeId, onlyPermanentAttach,
                           onlyPayedEvents, begPayDate, endPayDate)

        while query.next():
            record = query.record()
            okved = forceString(record.value('OKVED'))
            dispanser = forceBool(record.value('dispanser'))
            stage = forceString(record.value('stage'))
            group = forceString(record.value('group'))
            cnt = forceInt(record.value('cnt'))

            columns = [0]
            if dispanser:
                columns.append(4)
                if stage == '1':
                    columns.append(5)
                elif stage == '2':
                    columns.append(6)
            if group == '1':
                columns.append(7)
            elif group == '2':
                columns.append(8)
            elif group == '3':
                columns.append(9)
            elif group == '4':
                columns.append(10)
            elif group == '5':
                columns.append(11)
            for row in dispatch(okved):
                for column in columns:
                    reportData[row][column] += cnt

        # now text
        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)

        cursor.setCharFormat(CReportBase.ReportTitle)
        cursor.insertText(u'Итоги дополнительной диспансеризации граждан')
        cursor.insertBlock()
        self.dumpParams(cursor, params)
        cursor.insertText(u'(2000)')
        cursor.insertBlock()

        tableColumns = [
            ('30%', [
                u'Наименование вида экономической деятельности гражданина, прошедшего диспансеризацию',
                u'', u'', u'1'
            ], CReportBase.AlignLeft),
            ('5%', [u'№ строки', u'', u'', u'2'], CReportBase.AlignCenter),
            ('5%', [
                u'Численность работающих граждан, прошедших дополнительную диспансеризацию (законченные случаи), чел.',
                u'Всего', u'', u'3'
            ], CReportBase.AlignRight),
            ('5%', [u'', u'в том числе:', u'Город-\nских',
                    u'4'], CReportBase.AlignRight),
            ('5%', [u'', u'', u'Сель-\nских', u'5'], CReportBase.AlignRight),
            ('5%', [
                u'', u'',
                u'осмо-\nтренных спе-\nциали-\nстами выез-\nдных бри-\nгад (зако-\nнчен-\nные слу-\nчаи)',
                u'6'
            ], CReportBase.AlignRight),
            ('5%', [u'взято на Д-учет', u'Всего', u'',
                    u'7'], CReportBase.AlignRight),
            ('5%', [
                u'', u'в том числе:',
                u'на ранних стад-\nиях забо-\nлева-\nния', u'8'
            ], CReportBase.AlignRight),
            ('5%',
             [u'', u'', u'на поздних стади-\nях забо-\nлева-\nния',
              u'9'], CReportBase.AlignRight),
            ('5%', [
                u'Распределение прошедших дополнительную диспансеризацию граждан по группам состояния здоровья',
                u'I гр.', u'', u'10'
            ], CReportBase.AlignRight),
            ('5%', [u'', u'II гр.', u'', u'11'], CReportBase.AlignRight),
            ('5%', [u'', u'III гр.', u'', u'12'], CReportBase.AlignRight),
            ('5%', [u'', u'IV гр.', u'', u'13'], CReportBase.AlignRight),
            ('5%', [u'', u'V гр.', u'', u'14'], CReportBase.AlignRight),
        ]

        table = createTable(cursor, tableColumns)
        table.mergeCells(0, 0, 3, 1)
        table.mergeCells(0, 1, 3, 1)
        table.mergeCells(0, 2, 1, 4)
        table.mergeCells(1, 2, 2, 1)
        table.mergeCells(1, 3, 1, 3)
        table.mergeCells(0, 6, 1, 3)
        table.mergeCells(1, 6, 2, 1)
        table.mergeCells(1, 7, 1, 2)
        table.mergeCells(0, 9, 1, 5)
        table.mergeCells(1, 9, 2, 1)
        table.mergeCells(1, 10, 2, 1)
        table.mergeCells(1, 11, 2, 1)
        table.mergeCells(1, 12, 2, 1)
        table.mergeCells(1, 13, 2, 1)

        for iRow, row in enumerate(rows):
            tableRow = table.addRow()
            for i in xrange(2):
                table.setText(tableRow, i, row[i])
            for i in xrange(reportRowSize):
                if not (i in [1, 2, 3]):
                    table.setText(tableRow, 2 + i, reportData[iRow][i])

        return doc
Esempio n. 16
0
    def getInfo(self):
        if self.eventId and self.params:
            APMaxList = {}
            APMinList = {}
            temperatureList = {}
            pulseList = {}
            chkTemperature = self.params.get('chkTemperature', 0)
            chkPulse = self.params.get('chkPulse', 0)
            chkAPMax = self.params.get('chkAPMax', 0)
            chkAPMin = self.params.get('chkAPMin', 0)
            self.multipleDimension = self.params.get('multipleDimension', 0)
            begDate = self.params.get('begDate', None)
            endDate = self.params.get('endDate', None)
            if begDate and endDate and (begDate <= endDate):
                self.multipleDays = 2 if begDate == endDate else (
                    begDate.daysTo(endDate) + 2)
                if (begDate and endDate and chkTemperature or chkPulse
                        or chkAPMax or chkAPMin
                    ) and self.multipleDimension and self.multipleDays:
                    actionTypeIdList = self.getTemperatureSheetActionTypes()
                    diseaseDayList = {}
                    actionIdList = []

                    for recordDiseaseDay in self.getDeseaseDayRecords(
                            begDate, endDate, actionTypeIdList):
                        actionId = forceRef(
                            recordDiseaseDay.value('action_id'))
                        actionIdList.append(actionId)
                        diseaseDay = forceInt(
                            recordDiseaseDay.value('value')) - 1
                        endDate = forceDate(recordDiseaseDay.value('endDate'))
                        endDateStr = pyDate(endDate)
                        endTime = forceTime(recordDiseaseDay.value('endDate'))
                        endTimeStr = pyTime(endTime)
                        if (diseaseDay, endTimeStr,
                                endDateStr) not in diseaseDayList.keys():
                            diseaseDayList[(diseaseDay, endTimeStr,
                                            endDateStr)] = actionId

                    self.modelTemperatureSheet.loadHeader(
                        diseaseDayList, self.multipleDimension)
                    self.modelTemperatureSheet.loadData(
                        self.eventId, diseaseDayList, actionIdList, begDate,
                        endDate, actionTypeIdList)

                    if chkTemperature:
                        for recordTemperature in self.getTemperatureRecords(
                                begDate, endDate, actionIdList,
                                actionTypeIdList):
                            actionId = forceRef(
                                recordTemperature.value('action_id'))
                            temperature = forceDouble(
                                recordTemperature.value('value'))
                            for key, value in diseaseDayList.items():
                                if actionId == value:
                                    temperatureList[key] = temperature
                                    break
                    if chkAPMax:
                        for recordAPMax in self.getArterialPressureMaxRecords(
                                begDate, endDate, actionIdList,
                                actionTypeIdList):
                            actionId = forceRef(recordAPMax.value('action_id'))
                            APMax = forceInt(recordAPMax.value('value'))
                            for key, value in diseaseDayList.items():
                                if actionId == value:
                                    APMaxList[key] = APMax
                                    break
                    if chkAPMin:
                        for recordAPMin in self.getArterialPressureMinRecords(
                                begDate, endDate, actionIdList,
                                actionTypeIdList):
                            actionId = forceRef(recordAPMin.value('action_id'))
                            APMin = forceInt(recordAPMin.value('value'))
                            for key, value in diseaseDayList.items():
                                if actionId == value:
                                    APMinList[key] = APMin
                                    break
                    if chkPulse:
                        for recordPulse in self.getPulseRecords(
                                begDate, endDate, actionIdList,
                                actionTypeIdList):
                            actionId = forceRef(recordPulse.value('action_id'))
                            pulse = forceInt(recordPulse.value('value'))
                            for key, value in diseaseDayList.items():
                                if actionId == value:
                                    pulseList[key] = pulse
                                    break
                cnt = 0
                self.dimension = round(1 / float(self.multipleDimension), 2)
                self.countGraphic = 0
                if chkTemperature:
                    self.countGraphic += 1
                if chkAPMax:
                    self.countGraphic += 1
                if chkAPMin:
                    self.countGraphic += 1
                if chkPulse:
                    self.countGraphic += 1

                self.qwtPlotList = []
                self.scrollArea.viewport().setAutoFillBackground(True)
                plotLayout = QtGui.QVBoxLayout(
                    QtGui.QFrame(self.scrollArea.widget()))
                if chkTemperature:
                    xa, ya, minValue1, maxValue1, titleList = self.getXY(
                        temperatureList)
                    obj = CCreateGraph(self, xa, ya,
                                       minValue1 if minValue1 < 35 else 35,
                                       maxValue1 if maxValue1 > 40 else 40, 1,
                                       cnt, QtCore.Qt.red, u'Температура',
                                       titleList)
                    plotLayout.addWidget(obj.qwtPlot)
                    cnt += 1
                if chkAPMax:
                    xa2, ya2, minValue2, maxValue2, titleList = self.getXY(
                        APMaxList)
                    obj2 = CCreateGraph(self, xa2, ya2,
                                        minValue2 if minValue2 < 50 else 50,
                                        maxValue2 if maxValue2 > 175 else 175,
                                        25, cnt, QtCore.Qt.blue,
                                        u'Давление максимальное', titleList)
                    plotLayout.addWidget(obj2.qwtPlot)
                    cnt += 1
                if chkAPMin:
                    xa3, ya3, minValue3, maxValue3, titleList = self.getXY(
                        APMinList)
                    obj3 = CCreateGraph(self, xa3, ya3,
                                        minValue3 if minValue3 < 50 else 50,
                                        maxValue3 if maxValue3 > 175 else 175,
                                        25, cnt, QtCore.Qt.blue,
                                        u'Давление минимальное', titleList)
                    plotLayout.addWidget(obj3.qwtPlot)
                    cnt += 1
                if chkPulse:
                    xa4, ya4, minValue4, maxValue4, titleList = self.getXY(
                        pulseList)
                    obj4 = CCreateGraph(self, xa4, ya4,
                                        minValue4 if minValue4 < 60 else 60,
                                        maxValue4 if maxValue4 > 120 else 120,
                                        10, cnt, QtCore.Qt.darkGreen, u'Пульс',
                                        titleList)
                    plotLayout.addWidget(obj4.qwtPlot)
                    cnt += 1
                widgetLayout = QtGui.QWidget()
                widgetLayout.setLayout(plotLayout)
                self.scrollArea.setWidget(widgetLayout)
Esempio n. 17
0
    def build(self, params):
        def printAll(reportData):
            totalByReport = printOrgStructures(reportData)
            i = table.addRow()
            table.setText(i,
                          1,
                          u'Итого:',
                          charFormat=boldChars,
                          blockFormat=CReportBase.AlignRight)
            table.mergeCells(i, 0, 1, 2)
            table.setText(i,
                          2,
                          totalByReport[0],
                          blockFormat=CReportBase.AlignRight)
            table.setText(i,
                          3,
                          "%.2f" % (totalByReport[1]),
                          blockFormat=CReportBase.AlignRight)

        def printOrgStructures(reportData):
            total = [0, 0]
            orgStructures = reportData.keys()
            orgStructures.sort()
            for orgStructure in orgStructures:
                i = table.addRow()
                table.setText(i,
                              0,
                              getOrgStructureFullName(orgStructure) if
                              orgStructure else u'Подразделение не определено',
                              charFormat=boldChars,
                              blockFormat=CReportBase.AlignLeft)
                table.mergeCells(i, 0, 1, 4)

                i = table.addRow()
                table.setText(
                    i, 0, u'Номера реестров: ' +
                    u', '.join(sorted(orgStructureAccounts[orgStructure])))
                table.mergeCells(i, 0, 1, 4)

                totalByOrgStructure = printServices(reportData[orgStructure])
                total = map(add, total, totalByOrgStructure)

                i = table.addRow()
                table.setText(i,
                              0,
                              u'Итого по отделению:',
                              charFormat=boldChars,
                              blockFormat=CReportBase.AlignRight)
                table.mergeCells(i, 0, 1, 2)
                table.setText(i,
                              2,
                              totalByOrgStructure[0],
                              blockFormat=CReportBase.AlignRight)
                table.setText(i,
                              3,
                              "%.2f" % (totalByOrgStructure[1]),
                              blockFormat=CReportBase.AlignRight)
            return total

        def printServices(reportData):
            total = [0, 0]
            services = reportData.keys()
            services.sort()
            for serviceCode, serviceName in services:
                i = table.addRow()
                table.setText(i, 0, serviceCode)
                table.setText(i, 1, serviceName)
                totalByService = reportData[(serviceCode, serviceName)]
                total = map(add, total, totalByService)
                table.setText(i,
                              2,
                              totalByService[0],
                              blockFormat=CReportBase.AlignRight)
                table.setText(i,
                              3,
                              "%.2f" % (totalByService[1]),
                              blockFormat=CReportBase.AlignRight)
            return total

        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)

        cursor.setBlockFormat(CReportBase.AlignRight)
        cursor.setCharFormat(CReportBase.ReportBody)
        cursor.insertText(u'Форма Э-5П')
        cursor.insertBlock()

        cursor.setBlockFormat(CReportBase.AlignCenter)
        cursor.setCharFormat(CReportBase.ReportTitle)
        cursor.insertText(self.title())
        cursor.insertBlock()

        self.dumpParams(cursor, params)
        cursor.insertBlock()

        query = self.selectData(params)
        self.setQueryText(forceString(query.lastQuery()))

        orgStructureMap = {}
        orgStructureAccounts = {}
        while query.next():
            record = query.record()
            orgStructureId = forceRef(record.value('orgStructureId'))
            orgStructureAccounts.setdefault(orgStructureId, set()).add(
                forceString(record.value('number')))

            serviceMap = orgStructureMap.setdefault(orgStructureId, {})
            serviceCode = forceString(record.value('serviceCode'))
            serviceCode = serviceCode if serviceCode else None
            serviceName = forceString(record.value('serviceName'))
            serviceName = serviceName if serviceName else None
            existData = serviceMap.setdefault((serviceCode, serviceName),
                                              [0, 0])

            data = [
                forceInt(record.value('amount')),
                forceDouble(record.value('sum'))
            ]
            serviceMap[(serviceCode, serviceName)] = map(add, existData, data)

        boldChars = QtGui.QTextCharFormat()
        boldChars.setFontWeight(QtGui.QFont.Bold)

        tableColumns = [
            ('10%', [u'Услуга', u'Код'], CReportBase.AlignLeft),
            ('70%', [u'', u'Наименование'], CReportBase.AlignLeft),
            ('10%', [u'Кол-во услуг', u''], CReportBase.AlignLeft),
            ('10%', [u'Сумма', u''], CReportBase.AlignLeft),
        ]
        table = createTable(cursor, tableColumns)
        table.mergeCells(0, 0, 1, 2)
        table.mergeCells(0, 2, 2, 1)
        table.mergeCells(0, 3, 2, 1)

        printAll(orgStructureMap)

        return doc
Esempio n. 18
0
    def build(self, params):
        query = selectData(params)
        self.setQueryText(forceString(query.lastQuery()))
        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)
        cursor.setCharFormat(CReportBase.ReportTitle)

        org_id = QtGui.qApp.currentOrgId()
        org_info = getOrganisationInfo(org_id)

        cursor.insertBlock(CReportBase.AlignCenter)
        cursor.insertText(org_info.get('fullName'))
        cursor.insertBlock(CReportBase.AlignCenter)
        cursor.insertText(self.title())

        cursor.insertBlock()
        self.dumpParams(cursor, params)
        cursor.insertBlock()
        tableColumns = [
            ('4%',   [u'№ п/п'],                        CReportBase.AlignCenter),
            ('16%',  [u'Отделение,\n№ ИБ'],             CReportBase.AlignCenter),
            ('5%',   [u'Дата актирования'],             CReportBase.AlignCenter),
            ('15%',  [u'Фамилия Имя Отчество'],         CReportBase.AlignCenter),
            ('5%',   [u'Возраст,\nДата рождения'],      CReportBase.AlignCenter),
            ('20%',  [u'Кем направлен, доставлен'],     CReportBase.AlignCenter),
            ('15%',  [u'Наличие предметов подлежащих актированию'], CReportBase.AlignCenter),
            ('10%',  [u'Сдал'],                         CReportBase.AlignCenter),
            ('10%',  [u'Принял'],                       CReportBase.AlignCenter)]
        table = createTable(cursor, tableColumns)
        total = 0
        total_passport = 0
        total_policy = 0
        while query.next():
            record = query.record()
            counterValue = forceString(record.value('counterValue'))
            externalId = forceString(record.value('externalId'))
            structure = forceString(record.value('structure'))
            date = forceString(record.value('endDate'))
            cl_lastName = record.value('cl_lastName')
            cl_firstName = record.value('cl_firstName')
            cl_patrName = record.value('cl_patrName')
            cl_birthDate = record.value('cl_birthDate')
            organisation = forceString(record.value('organisation'))
            delivered_by = forceString(record.value('delivered_by'))

            passport = u'Сдан паспорт' if forceInt(record.value('passport')) else u''
            policy = u'Сдан полис' if forceInt(record.value('policy')) else u''
            amb = u'АМБ' if forceInt(record.value('amb')) else u''
            total_passport += 1 if passport else 0
            total_policy += 1 if policy else 0

            worth = forceString(record.value('worth'))
            money = forceString(record.value('money'))
            person_name = forceString(record.value('person_name'))
            i = table.addRow()
            FIO = formatName(cl_lastName, cl_firstName, cl_patrName)
            table.setText(i, 0, counterValue)
            table.setText(i, 1, u'%s,\nиб: %s' % (structure, externalId))
            table.setText(i, 2, date)
            table.setText(i, 3, FIO)
            table.setText(i, 4, '%s\n%s' % (calcAge(cl_birthDate), forceString(cl_birthDate)))
            table.setText(i, 5, '%s\n%s' % (organisation, delivered_by))
            table.setText(i, 6, '\n'.join(filter(None, (passport,
                                                        policy,
                                                        amb,
                                                        u'Кв. ценностей № %s' % worth if worth else u'',
                                                        u'Кв. денежная № %s' % money if money else u''))))
            table.setText(i, 7, FIO)
            table.setText(i, 8, person_name)
            total += 1
        i = table.addRow()
        table.setText(i, 0, u'Итого: %d' % total, CReport.TableTotal, CReport.AlignLeft)
        table.setText(i, 6, u'Сдано паспортов: %d\nСдано полисов: %d' % (total_passport, total_policy), CReport.TableTotal, CReport.AlignLeft)
        table.mergeCells(i, 0, 1, 6)
        table.mergeCells(i, 6, 1, 3)
        return doc
Esempio n. 19
0
    def build(self, params):
        lstOrgStructureDict = params.get('lstOrgStructure', None)
        lstOrgStructure = lstOrgStructureDict.keys()
        lstOperationDict = params.get('lstOperation', None)
        lstOperation = lstOperationDict.keys()
        lstSpecialityDict = params.get('lstSpeciality', None)
        lstSpeciality = lstSpecialityDict.keys()
        query = selectData(params, lstSpeciality, lstOrgStructure,
                           lstOperation)
        self.setQueryText(forceString(query.lastQuery()))

        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)
        cursor.setCharFormat(CReportBase.ReportTitle)
        cursor.insertText(self.title())
        cursor.insertBlock()
        self.dumpParams(cursor, params)
        cursor.insertBlock()

        tableColumns = [
            ('10%', [u'Отделение'], CReportBase.AlignLeft),
            ('20%', [u'ФИО'], CReportBase.AlignRight),
            (' 5%', [u'Количество выбывших'], CReportBase.AlignLeft),
            (' 5%', [u'Оперировано (количество выбывших)'],
             CReportBase.AlignLeft),
            (' 5%', [u'Количество операций'], CReportBase.AlignLeft),
            (' 5%', [u'Хир. актив %'], CReportBase.AlignLeft),
            (' 5%', [u'Имели осложнен.'], CReportBase.AlignLeft),
            (' 5%', [u'После опер. ослож'], CReportBase.AlignLeft),
            (' 5%', [u'Исход', u'Выписано'], CReportBase.AlignLeft),
            (' 5%', [u'', u'Умерло'], CReportBase.AlignLeft),
            (' 5%', [u'', u'Переведен'], CReportBase.AlignLeft),
            (' 5%', [u'', u'На долеч'], CReportBase.AlignLeft),
            (' 5%', [u'Умерло оперирован'], CReportBase.AlignLeft),
            (' 5%', [u'Послеоп. летал %'], CReportBase.AlignLeft),
            (' 5%', [u'Выздороление'], CReportBase.AlignLeft),
            (' 5%', [u'Улучшение'], CReportBase.AlignLeft),
            (' 5%', [u'Ухудшение'], CReportBase.AlignLeft),
            (' 5%', [u'Без перемен'], CReportBase.AlignLeft)
        ]

        table = createTable(cursor, tableColumns)
        countColumns = len(tableColumns)

        table.mergeCells(0, 8, 1, 4)
        for column in xrange(countColumns):
            if column < 8 or column > 11:
                table.mergeCells(0, column, 2, 1)

        currentOrgStructure = None
        countPerson = 0
        totalOrgStructure = [0] * (countColumns - 2)
        total = [0] * (countColumns - 2)
        while query.next():
            record = query.record()
            code = forceString(record.value('code'))
            person = forceString(record.value('person'))
            leaved = forceInt(record.value('leaved'))
            operation = forceInt(record.value('operation'))
            operationClient = forceInt(record.value('operationClient'))
            resultDischarged = forceInt(record.value('resultDischarged'))
            resultDead = forceInt(record.value('resultDead'))
            resultTransferred = forceInt(record.value('resultTransferred'))
            resultContinued = forceInt(record.value('resultContinued'))
            resultRecovery = forceInt(record.value('resultRecovery'))
            resultImprovement = forceInt(record.value('resultImprovement'))
            resultDeterioration = forceInt(record.value('resultDeterioration'))
            resultStatic = forceInt(record.value('resultStatic'))

            i = table.addRow()
            if currentOrgStructure != code:
                if currentOrgStructure is not None:
                    table.setText(i, 1, u'Итого', CReportBase.TableTotal)
                    for column, value in enumerate(totalOrgStructure):
                        if column in [3, 11]:
                            if column == 3:
                                table.setText(
                                    i, column + 2,
                                    forceDouble(
                                        (totalOrgStructure[column - 1] * 100) /
                                        totalOrgStructure[column - 2])
                                    if totalOrgStructure[column - 2] else 0,
                                    CReportBase.TableTotal)
                            else:
                                table.setText(
                                    i, column + 2,
                                    forceDouble(
                                        (totalOrgStructure[column - 1] * 100) /
                                        totalOrgStructure[2])
                                    if totalOrgStructure[2] else 0,
                                    CReportBase.TableTotal)
                            continue
                        total[column] += value
                        table.setText(i, column + 2, value,
                                      CReportBase.TableTotal)
                    totalOrgStructure = [0] * (countColumns - 2)
                    table.mergeCells(i - countPerson, 0, countPerson + 1, 1)
                    i = table.addRow()
                table.setText(i, 0, code)
                currentOrgStructure = code
                countPerson = 0

            table.setText(i, 1, person)
            table.setText(i, 2, leaved)
            table.setText(i, 3, operation)
            table.setText(i, 4, operationClient)
            table.setText(
                i, 5,
                forceDouble((operationClient * 100) /
                            operation if operation else 0))
            table.setText(i, 8, resultDischarged)
            table.setText(i, 9, resultDead)
            table.setText(i, 10, resultTransferred)
            table.setText(i, 11, resultContinued)
            table.setText(i, 12, resultDead)
            table.setText(
                i, 13,
                forceDouble((resultDead * 100) /
                            operationClient if operationClient else 0))
            table.setText(i, 14, resultRecovery)
            table.setText(i, 15, resultImprovement)
            table.setText(i, 16, resultDeterioration)
            table.setText(i, 17, resultStatic)

            totalOrgStructure[0] += leaved
            totalOrgStructure[1] += operation
            totalOrgStructure[2] += operationClient
            totalOrgStructure[6] += resultDischarged
            totalOrgStructure[7] += resultDead
            totalOrgStructure[8] += resultTransferred
            totalOrgStructure[9] += resultContinued
            totalOrgStructure[10] += resultDead
            totalOrgStructure[12] += resultRecovery
            totalOrgStructure[13] += resultImprovement
            totalOrgStructure[14] += resultDeterioration
            totalOrgStructure[15] += resultStatic
            countPerson += 1

        i = table.addRow()
        table.setText(i, 1, u'Итого', CReportBase.TableTotal)
        for column, value in enumerate(totalOrgStructure):
            if column in [3, 11]:
                if column == 3:
                    table.setText(
                        i, column + 2,
                        forceDouble((totalOrgStructure[column - 1] * 100) /
                                    totalOrgStructure[column - 2])
                        if totalOrgStructure[column - 2] else 0,
                        CReportBase.TableTotal)
                else:
                    table.setText(
                        i, column + 2,
                        forceDouble((totalOrgStructure[column - 1] * 100) /
                                    totalOrgStructure[2])
                        if totalOrgStructure[2] else 0, CReportBase.TableTotal)
                continue
            total[column] += value
            table.setText(i, column + 2, value, CReportBase.TableTotal)
        table.mergeCells(i - countPerson, 0, countPerson + 1, 1)
        i = table.addRow()
        table.setText(i, 0, u'Стационар', CReportBase.TableTotal)
        for column, value in enumerate(total):
            if column in [3, 11]:
                if column == 3:
                    table.setText(
                        i, column + 2,
                        forceDouble(
                            (total[column - 1] * 100) /
                            total[column - 2]) if total[column - 2] else 0,
                        CReportBase.TableTotal)
                else:
                    table.setText(
                        i, column + 2,
                        forceDouble((total[column - 1] * 100) /
                                    total[2]) if total[2] else 0,
                        CReportBase.TableTotal)
                continue
            table.setText(i, column + 2, value, CReportBase.TableTotal)
        return doc
Esempio n. 20
0
    def build2000(self, cursor, begDate, endDate, eventTypeId,
                  onlyPermanentAttach, onlyPayedEvents, begPayDate, endPayDate,
                  params):
        query = countByGroups(begDate, endDate, eventTypeId,
                              onlyPermanentAttach, onlyPayedEvents, begPayDate,
                              endPayDate)
        totalDone = 0
        totalContinued = 0
        totalByGroup = [0] * 5
        while query.next():
            record = query.record()
            done = forceBool(record.value('done'))
            group = forceInt(record.value('group'))
            cnt = forceInt(record.value('cnt'))
            if done:
                totalDone += cnt
                if 0 < group <= 5:
                    totalByGroup[group - 1] += cnt
            else:
                totalContinued += cnt

        # now text
        cursor.insertText(u'(2000)')
        cursor.insertBlock()
        tableColumns = [
            ('5%', [u'', '', '1'], CReportBase.AlignLeft),
            ('5%', [u'№ строки', '', '2'], CReportBase.AlignCenter),
            ('10%', [
                u'Число граждан', u'подлежащих дополнительной диспансеризации',
                '3'
            ], CReportBase.AlignRight),
            ('10%', [
                '',
                u'прошедших дополнительную диспансеризацию за отчетный период (законченный случай)',
                '4'
            ], CReportBase.AlignRight),
            ('10%', [
                '',
                u'проходящих дополнительную диспансеризацию в отчетном периоде (незаконченный случай)',
                '5'
            ], CReportBase.AlignRight),
            ('10%', [
                u'Распределение граждан, прошедших дополнительную диспансеризацию, по группам состояния здоровья',
                u'I группа - практически здоровые', '6'
            ], CReportBase.AlignRight),
            ('10%', ['', u'II группа - риск развития заболеваний',
                     '7'], CReportBase.AlignRight),
            ('10%', [
                '',
                u'III группа - нуждаются в дополнительном обследовании, лечении в амбулаторно- поликлинических условиях',
                '8'
            ], CReportBase.AlignRight),
            ('10%', [
                '',
                u'IV группа - нуждаются в дополнительном обследовании, лечении в стационарах',
                '9'
            ], CReportBase.AlignRight),
            ('10%', [
                '',
                u'V группа - нуждаются в высокотехнологичной медицинской помощи (ВМП)',
                '10'
            ], CReportBase.AlignRight),
        ]

        table = createTable(cursor, tableColumns)
        table.mergeCells(0, 0, 2, 1)
        table.mergeCells(0, 1, 2, 1)
        table.mergeCells(0, 2, 1, 3)
        table.mergeCells(0, 5, 1, 5)
        i = table.addRow()

        table.setText(i, 0, u'Всего')
        table.setText(i, 1, '01')
        table.setText(i, 2, forceString(params.get('tbl2000Col3', u'-')))
        table.setText(i, 3, totalDone)
        table.setText(i, 4, totalContinued)
        for j in xrange(len(totalByGroup)):
            table.setText(i, 5 + j, totalByGroup[j])
        return (totalDone, totalContinued, totalByGroup)
Esempio n. 21
0
 def evalSexByName(self, tableName, name):
     if not self.cmbSex.currentIndex():
         from library.Utils import forceInt
         detectedSex = forceInt(
             QtGui.qApp.db.translate(tableName, 'name', name, 'sex'))
         self.cmbSex.setCurrentIndex(detectedSex)
Esempio n. 22
0
    def buildInt(self, params, cursor):
        def addOnes(rows, column):
            for row in rows:
                reportData[row][column] += 1

        global ColumnGroups

        begDate = params.get('begDate', QtCore.QDate())
        endDate = params.get('endDate', QtCore.QDate())
        eventTypeId = params.get('eventTypeId', None)
        stageId = params.get('stageId', None)
        onlyPermanentAttach =  params.get('onlyPermanentAttach', False)
        onlyPayedEvents = params.get('onlyPayedEvents', False)
        begPayDate = params.get('begPayDate', QtCore.QDate())
        endPayDate = params.get('endPayDate', QtCore.QDate())

        db = QtGui.qApp.db

        mapColumnGroups = createMapCodeToRowIdx( [columnGroup[0] for columnGroup in ColumnGroups] )
        reportRowSize = 3
        reportData = [ [0] * reportRowSize for columnGroup in ColumnGroups ]
        query = selectData(begDate, endDate, eventTypeId, stageId, onlyPermanentAttach, onlyPayedEvents, begPayDate, endPayDate)

        prevClientId   = None
        prevMKB        = None
        while query.next() :
            record = query.record()
            clientId = forceInt(record.value('client_id'))
            mkb      = normalizeMKB(forceString(record.value('mkb')))
            if prevClientId != clientId or prevMKB != mkb:
                prevClientId = clientId
                prevMKB = mkb
                diagColumnGroups = mapColumnGroups.get(mkb, [])
                addOnes(diagColumnGroups,  0)
                if forceBool(record.value('P1')):
                    addOnes(diagColumnGroups, 1)
                    if forceBool(record.value('P2')):
                        addOnes(diagColumnGroups, 2)


        # now text
        cursor.insertText(u'(4000)')
        cursor.insertBlock()

        tableColumns = [
                          ('5%',
                            [ u'Выявлено больных с социально-значимыми заболеваниями (код по МКБ-10)' if i == 0 else u'',
                              ColumnGroups[i/3][1] if i%3 ==0 else u'',
                              [u'всего', u'в том числе впер-\nвые выяв-\nлено', u'из них на заданных ста-\nдиях забо-\nлева\nния'][i%3],
                              str(i+1)
                            ],
                            CReportBase.AlignRight
                          ) for i in xrange(3*len(ColumnGroups))
                       ]

        table = createTable(cursor, tableColumns, headerRowCount=1, border=3, cellPadding=2, cellSpacing=0)
        table.mergeCells(0, 0, 1, 3*len(ColumnGroups))
        for i in xrange(len(ColumnGroups)):
            table.mergeCells(1, i*3, 1, 3)

        i = table.addRow()
        for j in xrange(3*len(ColumnGroups)):
            table.setText(i, j, reportData[j/3][j%3])
Esempio n. 23
0
 def port(self, row):
     return forceInt(self.index(row, 4).data(QtCore.Qt.DisplayRole))
Esempio n. 24
0
 def getCurrentRLSCode(self):
     id = self.tblRLS.currentItemId()
     if id:
         code = forceInt(QtGui.qApp.db.translate('rls.rlsNomen', 'id', id, 'code'))
         return code
     return None
Esempio n. 25
0
File: Data.py Progetto: dio4/vista_1
    def getPersonItem(self, clientId):
        u"""
        :param clientId: Client.id
        :rtype: PersonItem
        """
        db = self.db
        tableClient = db.table('Client')
        tableDocument = db.table('ClientDocument')
        tableDocumentType = db.table('rbDocumentType')
        tablePolicy = db.table('ClientPolicy')
        tablePolicyKind = db.table('rbPolicyKind')
        tableInsurer = db.table('Organisation').alias('Ins')
        tableInsurerHead = db.table('Organisation').alias('InsHead')

        table = tableClient
        table = table.leftJoin(
            tableDocument, tableDocument['id'].eq(
                db.func.getClientDocumentId(tableClient['id'])))
        table = table.leftJoin(
            tableDocumentType,
            tableDocumentType['id'].eq(tableDocument['documentType_id']))
        table = table.leftJoin(
            tablePolicy, tablePolicy['id'].eq(
                db.func.getClientPolicyId(tableClient['id'], 1)))
        table = table.leftJoin(
            tablePolicyKind,
            tablePolicyKind['id'].eq(tablePolicy['policyKind_id']))
        table = table.leftJoin(
            tableInsurer, tableInsurer['id'].eq(tablePolicy['insurer_id']))
        table = table.leftJoin(
            tableInsurerHead,
            tableInsurerHead['id'].eq(tableInsurer['head_id']))

        cols = [
            tableClient['lastName'], tableClient['firstName'],
            tableClient['patrName'], tableClient['sex'],
            tableClient['birthDate'], tableClient['SNILS'],
            tableDocument['serial'].alias('docSerial'),
            tableDocument['number'].alias('docNumber'),
            tableDocumentType['code'].alias('docType'),
            tablePolicy['serial'].alias('policySerial'),
            tablePolicy['number'].alias('policyNumber'),
            tablePolicyKind['regionalCode'].alias('policyType'),
            db.ifnull(tableInsurerHead['miacCode'],
                      tableInsurer['miacCode']).alias('insurerCode'),
            db.ifnull(tableInsurerHead['OKATO'],
                      tableInsurer['OKATO']).alias('insurerOKATO')
        ]

        rec = self.db.getRecordEx(table, cols, tableClient['id'].eq(clientId))
        if rec:
            policyNumber = forceString(rec.value('policyNumber'))
            policyType = forceInt(rec.value('policyType'))
            return PersonItem(
                lastName=nameCase(forceString(rec.value('lastName'))),
                firstName=nameCase(forceString(rec.value('firstName'))),
                patrName=nameCase(forceString(rec.value('patrName'))),
                sex=forceInt(rec.value('sex')),
                birthDate=forceDate(rec.value('birthDate')),
                SNILS=formatSNILS(forceString(rec.value('SNILS'))),
                docSerial=forceString(rec.value('docSerial')),
                docNumber=forceString(rec.value('docNumber')),
                docType=forceInt(rec.value('docType')),
                policySerial=forceString(rec.value('policySerial')),
                policyNumber=policyNumber,
                policyType=policyType,
                insurerCode=forceString(rec.value('insurerCode')),
                insuranceArea=forceString(rec.value('insurerOKATO')),
            )

        return PersonItem()
Esempio n. 26
0
    def build(self, params):
        html = u'''
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
        <html>
            <head>
                <meta name="qrichtext" content="1" />
                <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                <style type="text/css">
                    p, li { margin-top:0px;
                            margin-bottom:0px;
                            margin-left:0px;
                            margin-right:0px;
                            -qt-block-indent:0;
                            text-indent:0px;}
                    span {font-family:'Times'; font-size:10pt;}
                    hr { margin-top:2px;
                        margin-bottom:2px;}
                </style>
            </head>
            <body style=" font-family:'Times'; font-size:10pt; font-weight:400; font-style:normal;">
            '''

        date = params.get('date', QtCore.QDate())
        moOrgInfo = params.get('moOrgInfo', {})
        moOrgMainStuff = params.get('moOrgMainStuff', [u'\n', u'\n'])
        smoOrgInfo = params.get('smoOrgInfo', {})
        counters = params.get('prik', {}).get('codeMOCounters', {})
        body = []
        body.append(insertText(u'''ПРИЛОЖЕНИЕ № 1\nк совместному приказу министерства\nздравоохранения Краснодарского края\nи Территориального фонда обязательного\nмедицинского страхования Краснодарского края\nот 27.07.2015 Г. № 6217/225-П''', 'right'))
        body.append(insertText(u'''\n\n<<УТВЕРЖДЕНО ПРИЛОЖЕНИЕ № 2\nк приказу министерства здравоохранения\nКраснодарского края и Территориального фонда\nобязательного медицинского страхования Краснодарского края\nот 14.07.2015 Г. № 3914/163-П>>''', 'right'))
        body.append(insertText(u'''Акт\nсверки численности застрахованного населения к медицинской организации\nна «%d» %s %dг.\n\n''' %(date.day(), monthNameGC[date.month()], date.year()), 'center'))
        body.append(insertBr())
        body.append(insertText(smoOrgInfo.get('fullName', u'\n'), 'center'))
        body.append(insertHr())
        body.append(insertText(u'(наименование СМО)', 'center'))
        body.append(insertBr())
        body.append(insertTable([('20%', u'%s' %moOrgInfo.get('infisCode', u'\n')),
                                 ('80%', u'%s' %moOrgInfo.get('fullName', u'\n'))], getFormat()))
        body.append(insertHr())
        body.append(insertTable([('20%', u'(код МО)'),
                                 ('80%', u'(наименование МО)')], getFormat()))
        body.append(insertBr())

        tableColumns = \
        [
            [
                ('6%',  [u'№ п/п'], {'align': AlignCenter, 'rowspan': 3}),
                ('7%', [u'Код структурного подраделения'], {'align': AlignCenter, 'rowspan': 3}),
                ('19%', [u'Наименование структурного подразделения'], {'align': AlignCenter, 'rowspan': 3}),
                ('68%',  [u'Количество прикрепленного застрахованного населения, чел.'], {'align': AlignCenter, 'colspan': 11})
            ],
            [
                ('8%', [u'Всего'],{'align': AlignCenter, 'rowspan': 2}),
                ('60%',  [u'из них'], {'align': AlignCenter, 'colspan': 10}),
            ],
            [
                ('6%', [u'от 0-1 муж.'], {'align': AlignCenter}),
                ('6%', [u'от 0-1 жен.'], {'align': AlignCenter}),
                ('6%', [u'от 1-4 муж.'], {'align': AlignCenter}),
                ('6%', [u'от 1-4 жен.'], {'align': AlignCenter}),
                ('6%', [u'от 5-17 муж.'], {'align': AlignCenter}),
                ('6%', [u'от 5-17 жен.'], {'align': AlignCenter}),
                ('6%', [u'от 18-59 муж.'], {'align': AlignCenter}),
                ('6%', [u'от 18-54 жен.'], {'align': AlignCenter}),
                ('6%', [u'от 60 муж.'], {'align': AlignCenter}),
                ('6%', [u'от 55 жен.'], {'align': AlignCenter}),
            ],
        ]

        it = 1
        total = 0
        totals = {'Male': [0] * 5,
                  'Female': [0] * 5}
        defaultArray = [u'не указано'] * 5
        for code, counter in sorted(counters.items(), key=lambda x: forceInt(x[0])):
            sub_total = sum(counter.get('Male', []) + counter.get('Female', []))
            total += sub_total
            for key in totals.keys():
                totals[key] = map(lambda x, y: x+y, totals[key], counter.get(key, [0] * 5))
            tableRow = [createTableCol(it),
                        createTableCol(code),
                        createTableCol(counter.get('shortName', u'')),
                        createTableCol(sub_total, AlignCenter),
                        createTableCol(counter.get('Male', defaultArray)[0], AlignCenter),
                        createTableCol(counter.get('Female', defaultArray)[0], AlignCenter),
                        createTableCol(counter.get('Male', defaultArray)[1], AlignCenter),
                        createTableCol(counter.get('Female', defaultArray)[1], AlignCenter),
                        createTableCol(counter.get('Male', defaultArray)[2], AlignCenter),
                        createTableCol(counter.get('Female', defaultArray)[2], AlignCenter),
                        createTableCol(counter.get('Male', defaultArray)[3], AlignCenter),
                        createTableCol(counter.get('Female', defaultArray)[3], AlignCenter),
                        createTableCol(counter.get('Male', defaultArray)[4], AlignCenter),
                        createTableCol(counter.get('Female', defaultArray)[4], AlignCenter),
                        ]
            tableColumns.append(tableRow)
            it += 1

        totalRow = [('', [u'ИТОГО по медицинской организации'], {'align': AlignLeft, 'colspan': 3}),
                    createTableCol(total, AlignCenter),
                    createTableCol(totals.get('Male', defaultArray)[0], AlignCenter),
                    createTableCol(totals.get('Female', defaultArray)[0], AlignCenter),
                    createTableCol(totals.get('Male', defaultArray)[1], AlignCenter),
                    createTableCol(totals.get('Female', defaultArray)[1], AlignCenter),
                    createTableCol(totals.get('Male', defaultArray)[2], AlignCenter),
                    createTableCol(totals.get('Female', defaultArray)[2], AlignCenter),
                    createTableCol(totals.get('Male', defaultArray)[3], AlignCenter),
                    createTableCol(totals.get('Female', defaultArray)[3], AlignCenter),
                    createTableCol(totals.get('Male', defaultArray)[4], AlignCenter),
                    createTableCol(totals.get('Female', defaultArray)[4], AlignCenter),
                    ]
        tableColumns.append(totalRow)

        table = createTable(tableColumns, {'border': 1})
        body.append(table)
        body.append(insertBr())
        body.append(insertTable([('20%', u''),
                                 ('20%', u''),
                                 ('80%',  u'%s' %moOrgMainStuff[0])], getFormat()))

        body.append(insertHr())
        body.append(insertTable([('20%', u'(подпись)'),
                                 ('20%', u''),
                                 ('80%', u'(Ф.И.О. руководителя МО)')], getFormat()))
        body.append(insertLine(u'МП'))
        body.append(insertBr())

        body.append(insertTable([('20%', u''),
                                 ('20%', u''),
                                 ('80%', u'%s' %smoOrgInfo.get('chief', u'\n'))], getFormat()))

        body.append(insertHr())
        body.append(insertTable([('20%', u'(подпись)'),
                                 ('20%', u''),
                                 ('80%', u'(Ф.И.О. руководителя СМО)')], getFormat()))
        body.append(insertLine(u'МП'))


        html += u'\n'.join(body)
        html += u'''
            </body>
        </html>
        '''
        return html
Esempio n. 27
0
 def build(self, params):
     begDate = params.get('begDate')
     endDate = params.get('endDate')
     chkEventType = params.get('chkEventType', False)
     eventTypeId = params.get('eventTypeId')
     lstEventTypeDict = params.get('lstEventType', None)
     lstEventType = lstEventTypeDict.keys()
     chkOrgStructure = params.get('cmbOrgStructure', False)
     orgStructureId = params.get('orgStructureId')
     lstOrgStructureDict = params.get('lstOrgStructure', None)
     lstOrgStructure = lstOrgStructureDict.keys()
     typeRegisty = params.get('typeRegistry')
     typeHospitalization = params.get('typeHospitalization')
     columnsFilter = params.get('columnsFilter')
     query = selectData(begDate, endDate, chkEventType, eventTypeId,
                        lstEventType, chkOrgStructure, orgStructureId,
                        lstOrgStructure, typeRegisty, typeHospitalization)
     doc = QtGui.QTextDocument()
     cursor = QtGui.QTextCursor(doc)
     cursor.setCharFormat(CReportBase.ReportTitle)
     cursor.insertText(self.title())
     cursor.insertBlock()
     self.dumpParams(cursor, params)
     cursor.insertBlock()
     filteredColumns = [
         col for col, mask in zip(columns.values(), columnsFilter.values())
         if mask
     ]
     colCount = len(filteredColumns)
     table = createTable(cursor, filteredColumns)
     total = [0] * 2
     orgTotal = [0] * 2
     prevOrgStructure = None
     self.setQueryText(forceString(query.lastQuery()))
     while query.next():
         record = query.record()
         orgStructure = forceString(record.value('orgStructure'))
         if not orgStructure:
             orgStructure = '-'
         if prevOrgStructure and orgStructure != prevOrgStructure and columnsFilter[
                 'Days']:
             i = table.addRow()
             table.mergeCells(
                 i, 0, 1, (colCount -
                           2 if columnsFilter['Result'] else colCount - 1))
             table.setText(i, 0, u'всего по ' + prevOrgStructure,
                           CReportBase.TableTotal)
             table.setText(
                 i, (colCount - 2 if columnsFilter['Result'] else colCount -
                     1),
                 forceString(orgTotal[0]) + u'/' + forceString(orgTotal[1]),
                 CReportBase.TableTotal)
             for index in xrange(2):
                 total[index] += orgTotal[index]
             orgTotal = [0] * 2
         if orgStructure != prevOrgStructure:
             i = table.addRow()
             table.mergeCells(i, 0, 1, colCount)
             i = table.addRow()
             table.setText(i, 0, orgStructure, CReportBase.TableTotal)
             table.mergeCells(i, 0, 1, colCount)
             prevOrgStructure = orgStructure
         i = table.addRow()
         days = forceInt(record.value('days'))
         orgTotal[0] += 1
         orgTotal[1] += days
         MKB = forceString(record.value('MKB'))
         recordFieldsVal = (
             orgTotal[0], forceString(record.value('lastName')) + ' ' +
             forceString(record.value('firstName')) + ' ' +
             forceString(record.value('patrName')),
             forceString(record.value('externalId')),
             forceString(record.value('address')),
             forceString(record.value('orgReceived')),
             forceString(record.value('orderEvent')),
             forceString(MKB + ' ' + forceString(
                 QtGui.qApp.db.translate('MKB_Tree', 'DiagID', MKB,
                                         'DiagName'))),
             forceString(record.value('setDate')),
             forceString(record.value('movingDate')),
             forceString(record.value('leavedDate')),
             forceString(record.value('profile')),
             forceString(record.value('operation')), days,
             forceString(record.value('result')))
         filteredRecordFieldsVal = [
             val
             for val, mask in zip(recordFieldsVal, columnsFilter.values())
             if mask
         ]
         for col, colVal in enumerate(filteredRecordFieldsVal):
             table.setText(i, col, colVal)
     if orgTotal[0] and columnsFilter['Days']:
         i = table.addRow()
         table.mergeCells(
             i, 0, 1,
             (colCount - 2 if columnsFilter['Result'] else colCount - 1))
         table.setText(i, 0, u'всего по ' + orgStructure,
                       CReportBase.TableTotal)
         table.setText(
             i, (colCount - 2 if columnsFilter['Result'] else colCount - 1),
             forceString(orgTotal[0]) + u'/' + forceString(orgTotal[1]),
             CReportBase.TableTotal)
         for index in xrange(2):
             total[index] += orgTotal[index]
     if columnsFilter['Days']:
         i = table.addRow()
         table.mergeCells(
             i, 0, 1,
             (colCount - 2 if columnsFilter['Result'] else colCount - 1))
         table.setText(i, 0, u'ИТОГОВОЕ ИТОГО по отделениям:',
                       CReportBase.TableTotal)
         table.setText(
             i, (colCount - 2 if columnsFilter['Result'] else colCount - 1),
             forceString(total[0]) + u'/' + forceString(total[1]),
             CReportBase.TableTotal)
     return doc
Esempio n. 28
0
    def build(self, params):
        mapMainRows = createMapCodeToRowIdx(
            [row[1] for row in MainRows if row[1]])
        registeredInPeriod = params.get('registeredInPeriod', False)
        begDate = params.get('begDate', QtCore.QDate())
        endDate = params.get('endDate', QtCore.QDate())
        eventPurposeIdList = params.get('eventPurposeIdList', [])
        eventTypeId = params.get('eventTypeId', None)
        specialityId = params.get('specialityId', None)
        hurtType = params.get('hurtType', None)
        orgStructureId = params.get('orgStructureId', None)
        personId = params.get('personId', None)
        ageFrom = params.get('ageFrom', 0)
        ageTo = params.get('ageTo', 150)
        socStatusClassId = params.get('socStatusClassId', None)
        socStatusTypeId = params.get('socStatusTypeId', None)
        onlyFirstTime = params.get('onlyFirstTime', False)
        notNullTraumaType = params.get('notNullTraumaType', False)
        accountAccomp = params.get('accountAccomp', False)
        locality = params.get('locality', 0)
        onlyChilds = params.get('onlyChilds', False)
        isPrimary = params.get('isPrimary', 0)

        cutAdultColumnsCount = 12 if onlyChilds else 0
        rowSize = 24
        reportMainData = [[0] * rowSize for row in xrange(len(MainRows) * 2)]

        query = selectData(registeredInPeriod, begDate, endDate,
                           eventPurposeIdList, eventTypeId, specialityId,
                           hurtType, orgStructureId, personId, ageFrom, ageTo,
                           socStatusClassId, socStatusTypeId, onlyFirstTime,
                           notNullTraumaType, accountAccomp, locality,
                           isPrimary)
        while query.next():
            record = query.record()
            sickCount = forceInt(record.value('sickCount'))
            MKB = normalizeMKB(forceString(record.value('MKB')))
            sex = forceInt(record.value('sex'))
            adult = forceBool(record.value('adult'))
            traumaType = forceString(record.value('traumaType'))

            mapTraumaTypeToColumns = mapAdultTraumaTypeToColumns if adult else mapChildTraumaTypeToColumns
            columns = mapTraumaTypeToColumns.get(traumaType, None)
            if not columns:
                columns = mapTraumaTypeToColumns['']
                mapTraumaTypeToColumns[traumaType] = columns

            baseIndex = (0 if sex == 1 else 1)
            rows = mapMainRows.get(MKB, [])
            for row in rows:
                reportLine = reportMainData[baseIndex + row * 2]
                for column in columns:
                    reportLine[column] += sickCount

        # now text
        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)

        #        cursor.setCharFormat(CReportBase.ReportTitle)
        #        cursor.insertText(u'Сведения о травмах, отравлениях и некоторых других последствиях воздействия внешних причин (Ф57)')
        #        cursor.insertBlock()
        #        cursor.setCharFormat(CReportBase.ReportBody)
        #        cursor.insertText(u'за период с %s по %s' % (forceString(begDate), forceString(endDate)))
        #        cursor.insertBlock()
        cursor.setCharFormat(CReportBase.ReportTitle)
        cursor.insertText(self.title())
        cursor.insertBlock()
        self.dumpParams(cursor, params)
        cursor.insertBlock()

        tableColumns = [
            ('15%', [
                u'Травмы, отравления и некоторые другие последствия воздействия внешних причин',
                u'', u'', u'', u'1'
            ], CReportBase.AlignLeft),
            ('15%', [u'Код по МКБ X', u'', u'', u'',
                     u'2'], CReportBase.AlignLeft),
            ('3%', [u'Пол', u'', u'', u'', u'3'], CReportBase.AlignCenter),
            ('3%', [u'№ стр.', u'', u'', u'', u'4'], CReportBase.AlignRight),
        ]
        if not onlyChilds:
            tableColumns.extend([
                ('3%', [
                    u'У взрослых (18 лет и старше)',
                    u'связанные с производством', u'пром', u'', u'5'
                ], CReportBase.AlignRight),
                ('3%', [u'', u'', u'с/х', u'', u'6'], CReportBase.AlignRight),
                ('3%', [u'', u'', u'трансп.', u'вс',
                        u'7'], CReportBase.AlignRight),
                ('3%', [u'', u'', u'', u'авт', u'8'], CReportBase.AlignRight),
                ('3%', [u'', u'', u'пр', u'', u'9'], CReportBase.AlignRight),
                ('3%', [u'', u'быт', u'', u'', u'10'], CReportBase.AlignRight),
                ('3%',
                 [u'', u'не связанные с производством', u'ул', u'',
                  u'11'], CReportBase.AlignRight),
                ('3%', [u'', u'', u'трансп.', u'вс',
                        u'12'], CReportBase.AlignRight),
                ('3%', [u'', u'', u'', u'авт', u'13'], CReportBase.AlignRight),
                ('3%', [u'', u'', u'спорт', u'',
                        u'14'], CReportBase.AlignRight),
                ('3%', [u'', u'', u'пр', u'', u'15'], CReportBase.AlignRight),
                ('3%', [u'', u'ИТОГО', u'', u'',
                        u'16'], CReportBase.AlignRight),
            ])
        tableColumns.extend([
            ('3%', [
                u'У детей (0 - 17 лет включительно)', u'быт', u'', u'',
                '%d' % (17 - cutAdultColumnsCount)
            ], CReportBase.AlignRight),
            ('3%', [u'', u'ул', u'', u'',
                    '%d' % (18 - cutAdultColumnsCount)],
             CReportBase.AlignRight),
            ('3%',
             [u'', u'трансп.', u'вс', u'',
              '%d' % (19 - cutAdultColumnsCount)], CReportBase.AlignRight),
            ('3%', [u'', u'', u'авт', u'',
                    '%d' % (20 - cutAdultColumnsCount)],
             CReportBase.AlignRight),
            ('3%', [u'', u'шк', u'', u'',
                    '%d' % (21 - cutAdultColumnsCount)],
             CReportBase.AlignRight),
            ('3%',
             [u'', u'спорт', u'', u'',
              '%d' % (22 - cutAdultColumnsCount)], CReportBase.AlignRight),
            ('3%', [u'', u'пр', u'', u'',
                    '%d' % (23 - cutAdultColumnsCount)],
             CReportBase.AlignRight),
            ('3%',
             [u'', u'ИТОГО', u'', u'',
              '%d' % (24 - cutAdultColumnsCount)], CReportBase.AlignRight),
            ('3%',
             [u'ВСЕГО', u'', u'', u'',
              '%d' % (25 - cutAdultColumnsCount)], CReportBase.AlignRight),
            ('3%', [
                u'Из гр.25', u'в рез. терр. дей-\nствий', u'', u'',
                '%d' % (26 - cutAdultColumnsCount)
            ], CReportBase.AlignRight),
            ('3%', [
                u'Из гр.26', u'у взро-\nслых', u'', u'',
                '%d' % (27 - cutAdultColumnsCount)
            ], CReportBase.AlignRight),
            ('3%',
             [u'', u'у детей', u'', u'',
              '%d' % (28 - cutAdultColumnsCount)], CReportBase.AlignRight),
        ])
        table = createTable(cursor, tableColumns)
        table.mergeCells(0, 0, 4, 1)  # п.н.
        table.mergeCells(0, 1, 4, 1)  # мкб
        table.mergeCells(0, 2, 4, 1)  # пол
        table.mergeCells(0, 3, 4, 1)  # N
        if not onlyChilds:
            table.mergeCells(0, 4, 1, 12)  # взрослые
            table.mergeCells(1, 4, 1, 5)  # произв.
            table.mergeCells(2, 4, 2, 1)  # пром
            table.mergeCells(2, 5, 2, 1)  # сх
            table.mergeCells(2, 6, 1, 2)  # тр
            table.mergeCells(2, 8, 2, 1)  # проч
            table.mergeCells(1, 9, 3, 1)  # быт
            table.mergeCells(1, 10, 1, 5)  # непроизв.
            table.mergeCells(2, 10, 2, 1)  # ул
            table.mergeCells(2, 11, 1, 2)  # тр
            table.mergeCells(2, 13, 2, 1)  # сп
            table.mergeCells(2, 14, 2, 1)  # пр
            table.mergeCells(1, 15, 3, 1)  # итого
        table.mergeCells(0, 16 - cutAdultColumnsCount, 1, 8)  # дети
        table.mergeCells(1, 16 - cutAdultColumnsCount, 3, 1)  # быт
        table.mergeCells(1, 17 - cutAdultColumnsCount, 3, 1)  # ул
        table.mergeCells(1, 18 - cutAdultColumnsCount, 1, 2)  # трансп
        table.mergeCells(2, 18 - cutAdultColumnsCount, 2, 1)  # всего
        table.mergeCells(2, 19 - cutAdultColumnsCount, 2, 1)  # авт
        table.mergeCells(1, 20 - cutAdultColumnsCount, 3, 1)  # шк
        table.mergeCells(1, 21 - cutAdultColumnsCount, 3, 1)  # сп
        table.mergeCells(1, 22 - cutAdultColumnsCount, 3, 1)  # пр
        table.mergeCells(1, 23 - cutAdultColumnsCount, 3, 1)  # итого
        table.mergeCells(0, 24 - cutAdultColumnsCount, 4, 1)  # ВСЕГО
        table.mergeCells(1, 25 - cutAdultColumnsCount, 3, 1)  # т.а.
        table.mergeCells(0, 26 - cutAdultColumnsCount, 1, 2)  # т.а. - по возр.
        table.mergeCells(1, 26 - cutAdultColumnsCount, 3, 1)  # т.а. - взрослые
        table.mergeCells(1, 27 - cutAdultColumnsCount, 3, 1)  # т.а. - дети

        for row, rowDescr in enumerate(MainRows):
            man = table.addRow()
            woman = table.addRow()
            table.setText(man, 0, rowDescr[0])
            table.setText(man, 1, rowDescr[1])
            table.mergeCells(man, 0, 2, 1)  # п.н.
            table.mergeCells(man, 1, 2, 1)  # мкб
            table.setText(man, 2, u'М')
            table.setText(man, 3, row * 2 + 1)
            reportLine = reportMainData[row * 2]
            for column in xrange(rowSize):
                if onlyChilds and (0 <= column <= 11):
                    continue
                table.setText(man, 4 + column - cutAdultColumnsCount,
                              reportLine[column])

            table.setText(woman, 2, u'Ж')
            table.setText(woman, 3, row * 2 + 2)
            reportLine = reportMainData[row * 2 + 1]
            for column in xrange(rowSize):
                if onlyChilds and (0 <= column <= 11):
                    continue
                table.setText(woman, 4 + column - cutAdultColumnsCount,
                              reportLine[column])
        return doc
Esempio n. 29
0
 def itemById(self, id):
     for item in self._items:
         if forceInt(item.value('id')) == id:
             return item
     return None
Esempio n. 30
0
    def build(self, params):
        lstOrgStructureDict = params.get('lstOrgStructure', None)
        lstOrgStructure = lstOrgStructureDict.keys()
        lstProfileBedDict = params.get('lstProfileBed', None)
        lstProfileBed = lstProfileBedDict.keys()
        query = selectData(params, lstOrgStructure, lstProfileBed)
        self.setQueryText(forceString(query.lastQuery()))
        doc = QtGui.QTextDocument()
        cursor = QtGui.QTextCursor(doc)
        cursor.setCharFormat(CReportBase.ReportTitle)
        cursor.insertText(self.title())
        cursor.insertBlock()
        self.dumpParams(cursor, params)
        cursor.insertBlock()
        tableColumns = [
            ('20%', [u'Отделение'], CReportBase.AlignLeft),
            ('20%', [u'Профиль'], CReportBase.AlignLeft),
            ('5%', [u'Развернуто коек'], CReportBase.AlignRight),
            ('5%', [u'Состояло'], CReportBase.AlignRight),
            ('5%', [u'Поступило'], CReportBase.AlignRight),
            ('5%', [u'Выбыло'], CReportBase.AlignRight),
            ('5%', [u'Переведено из др.отд.'], CReportBase.AlignRight),
            ('5%', [u'Переведено в др.отд.'], CReportBase.AlignRight),
            ('5%', [u'Переведено в др.стац.'], CReportBase.AlignRight),
            ('5%', [u'Умерло'], CReportBase.AlignRight),
            ('5%', [u'Состоит'], CReportBase.AlignRight),
            ('5%', [u'Назначено на выпис.'], CReportBase.AlignRight),
            ('5%', [u'Свободных мест'], CReportBase.AlignRight),
            ('5%', [u'Перегруз'], CReportBase.AlignRight)
        ]

        table = createTable(cursor, tableColumns)

        countColumns = len(tableColumns)

        currentOrgStructure = None
        countHospitalBed = 0
        totalOrgStructure = [0] * (countColumns - 2)
        total = totalOrgStructure
        while query.next():
            record = query.record()
            orgStructure = forceString(record.value('osName'))
            hbpName = forceString(record.value('hbpName'))
            deployed = forceInt(record.value('deployed'))
            moving = forceInt(record.value('moving'))
            leavedOther = forceInt(record.value('leavedOther'))
            received = forceInt(record.value('received'))
            leaved = forceInt(record.value('leaved'))
            leavedDeath = forceInt(record.value('leavedDeath'))
            movingInto = forceInt(record.value('movingInto'))
            movingFrom = forceInt(record.value('movingFrom'))
            overloadBed = 0
            freeBed = 0

            i = table.addRow()
            if currentOrgStructure != orgStructure:
                if currentOrgStructure is not None:
                    table.setText(i, 1, u'Итого', CReportBase.TableTotal)
                    for column, value in enumerate(totalOrgStructure):
                        total[column] += value
                        table.setText(i, column + 2, value,
                                      CReportBase.TableTotal)
                    table.mergeCells(i - countHospitalBed, 0,
                                     countHospitalBed + 1, 1)
                    i = table.addRow()
                totalOrgStructure = [0] * (countColumns - 2)
                table.setText(i, 0, orgStructure)
                currentOrgStructure = orgStructure
                countHospitalBed = 0

            isInHosp = moving + received - movingFrom + movingInto - leaved
            bookedBed = deployed - isInHosp
            if deployed:
                if bookedBed > 0:
                    freeBed = bookedBed
                else:
                    overloadBed = abs(bookedBed)
            table.setText(i, 1, hbpName)
            table.setText(i, 2, deployed)
            table.setText(i, 3, moving)
            table.setText(i, 4, received)
            table.setText(i, 5, leaved)
            table.setText(i, 6, movingInto)
            table.setText(i, 7, movingFrom)
            table.setText(i, 8, leavedOther)
            table.setText(i, 9, leavedDeath)
            table.setText(i, 10, isInHosp)
            table.setText(i, 11, 0)
            table.setText(i, 12, freeBed)
            table.setText(i, 13, overloadBed)

            totalOrgStructure[0] += deployed
            totalOrgStructure[1] += moving
            totalOrgStructure[2] += received
            totalOrgStructure[3] += leaved
            totalOrgStructure[4] += movingInto
            totalOrgStructure[5] += movingFrom
            totalOrgStructure[6] += leavedOther
            totalOrgStructure[7] += leavedDeath
            totalOrgStructure[8] += isInHosp
            totalOrgStructure[9] += 0
            totalOrgStructure[10] += freeBed
            totalOrgStructure[11] += overloadBed

            countHospitalBed += 1
        i = table.addRow()
        table.setText(i, 1, u'Итого', CReportBase.TableTotal)
        for column, value in enumerate(totalOrgStructure):
            total[column] += value
            table.setText(i, column + 2, value, CReportBase.TableTotal)
        table.mergeCells(i - countHospitalBed, 0, countHospitalBed + 1, 1)
        i = table.addRow()
        table.setText(i, 0, u'Стационар', CReportBase.TableTotal)
        for column, value in enumerate(total):
            table.setText(i, column + 2, value, CReportBase.TableTotal)

        return doc