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)
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
def idList(self): idList = [] for item in self._items: idList.append(forceInt(item.value('id'))) return idList
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
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)
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()
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
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
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
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
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)
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
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
def isEditable(self, action): return forceInt(action.getRecord().value('status')) < 2
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
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)
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
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
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
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)
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)
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])
def port(self, row): return forceInt(self.index(row, 4).data(QtCore.Qt.DisplayRole))
def getCurrentRLSCode(self): id = self.tblRLS.currentItemId() if id: code = forceInt(QtGui.qApp.db.translate('rls.rlsNomen', 'id', id, 'code')) return code return None
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()
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
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
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
def itemById(self, id): for item in self._items: if forceInt(item.value('id')) == id: return item return None
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